记忆问题

时间:2009-08-19 00:04:40

标签: objective-c memory memory-management

我有一些导致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时管理内存,所以我的问题是:第一个代码示例中发生了什么导致内存无效?

2 个答案:

答案 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中。