iphone - NSMutableArray 内存管理

标签 iphone cocoa macos

NSMutableArray *a1 = [[NSMutableArray alloc] init];
NSMutableArray *a2 = [NSMutableArray array];

TempObj *obj = [[TempObj alloc] init]; //assume this line is repeated for each obj
[a1 addObject:obj];
[a1 addObject:obj2];
[a1 addObject:obj3];
[a1 addObject:obj4];

[obj release];
[obj2 release];
[obj3 release];
[obj4 release];

[a1 release];

好吧,a2 是一个自动释放对象,所以我不必在它上面调用释放?另外你怎么知道你什么时候得到一个自动释放对象?

对于 a1,我不必循环遍历数组并首先释放每个对象?如果我调用 [a1 removeAllObjects]; 会怎样?是否调用 [[a1 objectAtIndex:#] release];

将这些对象添加到数组后,我是否应该释放它们?

最佳答案

当您将对象添加到数组时,它会对该对象调用retain。如果您不释放指向该对象的指针,则会发生泄漏。当您释放数组时,它将对其保存的所有对象调用 release,因为它之前调用了 retain

对于自动释放与释放,唯一可以确定的方法(除了可能阅读文档之外)是通过方法的名称。我认为一般规则是,如果您没有分配该对象,那么您不负责释放它。

关于对象创建方法,所有便捷方法(array:arrayWithObjects:arrayWithArray: 等)都返回 autoreleased对象。但是,它们相应的 init 方法(init:initWithObjects:initWithArray: 等)不会 - 如果您调用它们,那么您就是负责对返回的对象调用release

我似乎在这里记忆起有关此主题的其他一些问题 - 您可以尝试四处搜索以获取更全面的解释。

关于iphone - NSMutableArray 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/456233/

相关文章:

iphone - 在 iPhone 上点击时清除文本字段框

iPhone:如何关闭 MFMailComposeViewController?

cocoa - 比较版本号

xcode - 界面生成器分段控件?

javascript - img src 未连接到图像路径

iphone - ios iphone 开发中的 Relativelayout 或 LinearLayout?

objective-c - UISegmentedControl 自定义背景图片

macos - NSMultipleValuesMarker 在 Swift 3 中使用未声明的类型

objective-c - 核心情节 mouseMoved

macos - 在 OS X 上从命令行打开 Android Studio 项目