我对Objective-C很新,我在内存管理方面遇到了很多麻烦,但我仍然有点理解。如果我有一个对象,例如NSArray * myArray,我就这样做
myArray = [[NSArray alloc] initWithObjects:obj1,obj2,obj3,nil];
然后我正在做一些事情,我希望myArray包含新对象,然后我再次启动它
[myArray initWithObjects:obj4,obj5,obj6, nil];
似乎它能够满足我的需求,但它是否正确了内存管理的观点?是否会增加保留计数?我应该两次发布吗?
答案 0 :(得分:4)
不要那样做!
通常,如果要重置已存在的Objective C对象内的对象或事物,请创建并使用某种Setter方法。
对于您的阵列,再次不要这样做!您引用的“initWithObjects”方法可以方便地初始化一个不可变(不可更改)的数组,该数组将在整个生命周期内填充数组。
对于您要做的事情,只需使用NSMutableArray。它的文档如下:
答案 1 :(得分:4)
它不会增加保留计数。初始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
}
答案 2 :(得分:2)
这是一个老问题。但是我通过这个链接找到了类似的答案:
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#semantics-of-init
链接中的小引用:
程序导致两次或多次调用是未定义的行为 init方法对同一个对象,除了每个init方法 调用最多可以执行一次委托初始化调用。