Objective c 如果我多次调用nsobject init会发生什么?它会增加保留计数吗?

Objective c 如果我多次调用nsobject init会发生什么?它会增加保留计数吗?,objective-c,memory,init,nsobject,Objective C,Memory,Init,Nsobject,我是Objective-C的新手,我在内存管理方面有很多问题,但我还是懂一点。如果我有一个对象,比如NSArray*myArray,我会这样做 myArray = [[NSArray alloc] initWithObjects:obj1,obj2,obj3,nil]; 然后我正在做一些事情,我希望我的数组包含新对象,然后我再次初始化它 [myArray initWithObjects:obj4,obj5,obj6, nil]; 似乎它满足了我的需要,但从内存管理的角度来看,它是否正确?它是

我是Objective-C的新手,我在内存管理方面有很多问题,但我还是懂一点。如果我有一个对象,比如NSArray*myArray,我会这样做

myArray = [[NSArray alloc] initWithObjects:obj1,obj2,obj3,nil];
然后我正在做一些事情,我希望我的数组包含新对象,然后我再次初始化它

[myArray initWithObjects:obj4,obj5,obj6, nil];
似乎它满足了我的需要,但从内存管理的角度来看,它是否正确?它是否增加了保留计数?我应该释放它两次吗

不要那样做

一般来说,如果要重置已经存在的Objective C对象中的对象或对象,请创建并使用某种Setter方法

对于您的阵列,请再次不要执行此操作!您引用的“initWithObjects”方法可以方便地初始化一个不可变(不可变)数组,该数组在其整个生命周期中将填充这些项

对于您尝试执行的操作,只需使用NSMutableArray。其文档如下所示:


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

也就是说,您不应该对对象多次调用init方法。虽然您的示例可能会起作用,但充其量它可能会泄漏其内部存储,而不会释放您的
obj1
obj2
obj3
。最坏的情况是,它可能具有不一致的内部状态,并可能导致崩溃

如果只是执行几次,那么不妨创建一个新数组:

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
}

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

链接中的小引语:

一个程序引起两个或多个调用是未定义的行为 同一对象上的init方法,但每个init方法 调用最多可以执行一个委托初始化调用


谢谢你的回复,伙计。如果我能像你说的那样-myArray=[NSArray arraywhithpbjects];,你能解释一下为什么我要使用[[myArray alloc]init](这个问题不仅涉及数组,还涉及所有类型的对象)吗;?为什么人们在没有分配的情况下仍然使用alloc???[NSArray arrayWithObjects:]只是[[[NSArray alloc]initWithObjects:]自动释放]的快捷方式。