调用[objectInstance autorelease]
将对象添加到当前NSAutoreleasePool
. 当该池收到drain
消息时,它会向release
池中的所有对象发送一个消息。如果这些对象中的任何一个的 retainCount 达到 0,它们就会在此时被释放。autorelease 的目的是允许您标记要在“未来某个时间”释放的对象。这对于返回一个新分配的对象但想要释放它的方法特别有用,这样调用者就不必拥有返回的对象的所有权。一个方法可能如下所示:
- (id)myMethod {
id myObj = [[SomeClass alloc] init];
...
return [myObj autorelease];
}
如果他们想要获得返回值的所有权,则调用者myMethod
将retain
返回返回值,否则将忽略它。当电流NSAutoreleasePool
耗尽时,myObj
会得到一个释放信息。如果没有其他对象拥有它(即已向其发送retain
消息),它将被释放。
所有这些都在 Cocoa内存管理编程指南中进行了解释。即使你已经读过它,它总是值得再读一遍。
所以,回答你的问题:
首先,你应该释放theBackendResponse
. 如果不这样做,您将泄漏内存。您不需要知道accountDictionary
字符串的作用:如果它需要保留引用,它将保留theBackendResponse
。您拥有 的所有权,theBackendResponse
因为您拥有alloc
它,因此您必须放弃该所有权(通过release
或间接通过autorelease
)。
setAccountDictionary:
其次,如果要分别保留对该对象或值的引用,则必须保留或复制参数。标准的 setter 方法看起来像这样(假设您不需要原子语义):
-(void)setAccountDictionary:(NSDictionary*)newDict {
if(newDict != accountDictionary) {
id tmp = accountDictionary;
accountDictionary = [newDict copy]; //Since newDict may be mutable, we make a copy so that accountDictionary isn't mutated behind our back.
[tmp release];
}
}
您还必须记住release
在 dealloc 方法中使用 accountDictionary:
- (void)dealloc {
[accountDictionary release];
[super dealloc];
}
由于您似乎正在使用NSViewController
,我假设您使用的是 Leopard (OS X 10.5),在这种情况下,您可能应该使用@property
d @synthesize
getter/setter(如果可能)。为此,添加一个
@property (copy,readwrite) NSDictionary * accountDictionary;
向班级声明@interface
。并在你的控制器类的块中添加一个@synthesize accountDictionary;
指令。@implementation