Objective C指向原始类型的指针

时间:2015-07-23 16:47:04

标签: 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
    }
}

可以安全地翻译成目标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;
}
}

考试通过了,但我仍然没有那么自信。

任何想法指导都会受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

在Java代码示例中,您在Heap中分配内存,但在Objective C代码示例中,您在Stack中分配内存。

这是Heap中分配的变体:

-(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);
    }
}

答案 1 :(得分:1)

当您在堆栈上分配newArray并将指针传递给实例变量someArray时,您的实现将导致严重错误,但是一旦该方法返回,堆栈将被恢复,从而生成{{ 1}}一个悬垂的指针。

在Objective-C中使用someArrayNSArray对象更常见。如果要创建可在初始化后添加并以其他方式修改的数组,请使用NSNumber

NSMutableArray