我正在为我的 iPhone 应用程序使用 Core Data。我的属性是使用保留属性设置的。
例如,“事物”实体中的“数字”属性:
#import <CoreData/CoreData.h>
@interface Thing : NSManagedObject
{
}
@property (nonatomic, retain) NSNumber * number;
@end
@implementation Thing
@dynamic number;
@end
在我的代码中使用 Thing 对象时,我一直在设置 number 属性,如下所示:
thing.number = [[NSNumber alloc] initWithInteger:1];
但是,这会造成内存泄漏(由于 alloc plus 属性保留,新 NSNumber 对象的保留计数比期望的高一)。
由于这是针对 iPhone OS 的,我想自己管理内存,所以我选择不使用自动释放池(这也有更好的性能和更低的最大内存使用量的好处)。
我知道这种模式有效(并且已经在几个 SO 帖子中讨论过):
NSNumber *num = [[NSNumber alloc] initWithInteger:1]; thing.number = num; [num release];
这种模式非常清晰,但我对三行或临时变量并不感到兴奋。
我认为这也会起作用(但我在任何 SO 帖子上都没有注意到它):
thing.number = [[NSNumber alloc] initWithInteger:1]; [thing.number release];
这种模式不太清楚,但只需要两行并且不使用临时变量。
问题
是否有任何其他模式可以将新对象分配给保留属性(不使用自动释放池)?这里的最佳做法是什么?