Ios 目标C指向基元类型的指针

Ios 目标C指向基元类型的指针,ios,objective-c,pointers,primitive,Ios,Objective C,Pointers,Primitive,我来自java背景,我正试图弄清楚是否需要翻译以下java代码: public class SomeClass { private int[] someArray; //+....other instance variables public SomeClass(int arraySize) { this.someArray = new int[arraySize]; //some other initialization } }

我来自java背景,我正试图弄清楚是否需要翻译以下java代码:

public class SomeClass {
    private int[] someArray;
    //+....other instance variables

    public SomeClass(int arraySize) {
        this.someArray = new int[arraySize];
        //some other initialization
    }
}
可以安全地转化为目标C,如下所示:

@implementation SomeClass
{
    int *_myArray;
    //some other private fields...
}

-(instancetype)initWithArraySize:(int)arraySize
{
    if(self = [super init]) {
        int newArray[arraySize];
        _myArray = newArray;
        //some other initializations
    }
    return self;
}
}
我显然知道NSArray和NSNumber装箱,但上面的代码听起来更干净、更高效,特别是我的应用程序在某些情况下需要保存对SomeClass的数千个引用。同时,我不确定原始指针是否可以安全地与ARC一起使用,以及它们是否会导致泄漏

我已经尝试了以下虚拟测试,看看事情是否会按预期进行:

@implementation SomeClassTests
{
    int *_myArray;
    //some other private fields...
}

- (void)testExample {
    int array[] = {4, 2, 1, 0};
    _myArray = array;

    [self changeArray:_myArray];
    XCTAssertEqual(_myArray[0], -1);
    XCTAssertEqual(_myArray[1], -1);
    XCTAssertEqual(_myArray[2], 1);
}

-(void)changeArray:(int *)array
{
    array[1] = -1;
    array[0] = -1;
}
}
考试通过了,但我还是没有信心


任何思想指导都将不胜感激。

在Java代码示例中,您在堆中分配内存,但在Objective C代码示例中,您在堆栈中分配内存

以下是堆中分配的变量:

-(instancetype)initWithArraySize:(int)arraySize
{
    if(self = [super init]) {
        _myArray = malloc(arraySize * sizeof(int));
        //some other initializations
    }
    return self;
}

- (void)dealloc {
    if (_myArray != NULL) {
        free(_myArray);
    }
}

当您在堆栈上分配
newArray
并传递指向实例变量
someArray
的指针时,您的实现将导致严重错误,但是一旦该方法返回,堆栈将被恢复,从而使
someArray
成为悬空指针

在Objective-C中使用
NSNumber
对象的
NSArray
更为正常。如果要创建一个数组,该数组可以在初始化后添加到中,或者进行修改,请使用
NSMutableArray

@implementation SomeClass
{
    NSMutableArray *_someArray;
}

-(instancetype)initWithArraySize:(int)arraySize
{
    if(self = [super init]) {
        _someArray = [[NSMutableArray alloc] initWithCapacity:arraySize];
    }
    return self;
}

“但在目标C代码中,在堆栈中分配内存”。这不是真的。@特洛伊木马,该数组在其中初始化:
int newArray[arraySize]。但所有内存都分配在堆栈上的说法是不正确的。当我说“在目标C代码中”时,我指的是作者提供的特定代码。我会尽量说得更清楚一些。@ALTN如果您想要和java代码完全类似,那么您需要使用heap。另外,对于大型数组,最好使用堆。对于小型阵列,也可以使用堆,但在堆栈上,它的工作速度会稍快一些。一般来说,为了灵活性,我建议使用heap。如果使用堆分配(_myArray=malloc(arraySize*sizeof(int));),初始化后还会导致指针悬空吗?我试图通过避免NSMutableArray和NSNumber来减少内存占用。我需要实例化数千个实例来SomeClass@ALTN不,这很好,而且比Objective-C更适合C,但是,考虑到Objective-C为此提供了集合类。使用
malloc()!