我有一些导致EXC_BAD_ACCESS错误的代码:
recordIDAsString = [
NSString stringWithFormat:@"%i", (int)abRecord.recordID
];
propertyIDAsString = [
NSString stringWithFormat:@"%i", (int)abProperty.propertyID
];
identifierAsString = [
NSString stringWithFormat:@"%i", (int)abProperty.identifier
];
recordIDAsString,propertyIDAsString和identifierAsString都在界面中定义。代码包含在编辑视图控制器中,并且三个* AsString变量似乎正常工作,直到按下保存按钮,当它们的值变为无效时。但是,我发现以下代码确实有效:
NSString *tempRecordIDAsString = [
NSString stringWithFormat:@"%i", (int)abRecord.recordID
];
NSString *tempPropertyIDAsString = [
NSString stringWithFormat:@"%i", (int)abProperty.propertyID
];
NSString *tempIdentifierAsString = [
NSString stringWithFormat:@"%i", (int)abProperty.identifier
];
recordIDAsString = [tempRecordIDAsString copy];
propertyIDAsString = [tempPropertyIDAsString copy];
identifierAsString = [tempIdentifierAsString copy];
我以为我只需要在调用alloc或init时管理内存,所以我的问题是:第一个代码示例中发生了什么导致内存无效?
答案 0 :(得分:3)
通过...
创建的字符串[NSString stringWithFormat:@"%i", (int)abRecord.recordID]
...是自动释放的。它将在下一个自动释放池中消失,除非你得到它。
您需要重新访问内存管理指南:
http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
答案 1 :(得分:2)
NSString stringWithFormat是一个方便的构造函数 - 这意味着返回的对象将被自动释放,因此您不必这样做。导致的问题是,如果要保留该值,则必须保留或复制它。因此,即使您存储对值的引用,也不会增加其retainCount。因此,当当前运行循环完成时,自动释放池将向其所有对象发送一个释放,将retainCount减少1.如果使用retain,则将retainCount递增1,这样当autorelease释放对象时,它将仍然有一个retainCount,直到发送另一个版本 - 这应该由你在某个时候完成 - 也许在你的dealloc中。