我来自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;
}
}
考试通过了,但我仍然没有那么自信。
任何想法指导都会受到高度赞赏。
答案 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中使用someArray
个NSArray
对象更常见。如果要创建可在初始化后添加并以其他方式修改的数组,请使用NSNumber
:
NSMutableArray