如果我不止一次调用nsobject init会发生什么?它会增加保留计数吗?

时间:2011-11-07 12:32:57

标签: objective-c memory init nsobject

我对Objective-C很新,我在内存管理方面遇到了很多麻烦,但我仍然有点理解。如果我有一个对象,例如NSArray * myArray,我就这样做

myArray = [[NSArray alloc] initWithObjects:obj1,obj2,obj3,nil];

然后我正在做一些事情,我希望myArray包含新对象,然后我再次启动它

[myArray initWithObjects:obj4,obj5,obj6, nil];

似乎它能够满足我的需求,但它是否正确了内存管理的观点?是否会增加保留计数?我应该两次发布吗?

3 个答案:

答案 0 :(得分:4)

不要那样做!

通常,如果要重置已存在的Objective C对象内的对象或事物,请创建并使用某种Setter方法。

对于您的阵列,再次不要这样做!您引用的“initWithObjects”方法可以方便地初始化一个不可变(不可更改)的数组,该数组将在整个生命周期内填充数组。

对于您要做的事情,只需使用NSMutableArray。它的文档如下:

http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

答案 1 :(得分:4)

它不会增加保留计数。初始alloc将保留计数设置为1。

也就是说,你永远不应该在一个对象上多次调用init方法。虽然您的示例可能有用,但最多可能是泄漏其内部存储空间而不是释放obj1obj2obj3。在最坏的情况下,它可能会有不一致的内部状态,并可能导致崩溃。

如果您只是这样做几次,您也可以创建一个新阵列:

NSArray* myArray = [NSArray arrayWithObjects:obj1, obj2, obj3, nil];
// Do some stuff...
myArray = [NSArray arrayWithObjects:obj4, obj5, obj6, nil];
// Do more stuff

如果您正在做很多事情,例如,在循环中,您应该使用NSMutableArray:

NSMutableArray* myArray = [NSMutableArray array];
for (...) {
  [myArray removeAllObjects];
  [myArray addObject:obj4];
  [myArray addObject:obj5];
  [myArray addObject:obj6];
  // Do stuff
}

答案 2 :(得分:2)

这是一个老问题。但是我通过这个链接找到了类似的答案:

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#semantics-of-init

链接中的小引用:

  

程序导致两次或多次调用是未定义的行为   init方法对同一个对象,除了每个init方法   调用最多可以执行一次委托初始化调用。