调用[objectInstance autorelease] 会将对象添加到当前NSAutoreleasePool。当该池收到drain 消息时,它会向池中的所有对象发送release。如果这些对象中的任何一个的 retainCount 达到 0,它们就会在此时被释放。 autorelease 的目的是允许您标记要在“未来某个时间”释放的对象。这对于返回一个新分配的对象但想要释放它的方法特别有用,这样调用者就不必拥有返回的对象的所有权。方法可能如下所示:
- (id)myMethod {
id myObj = [[SomeClass alloc] init];
...
return [myObj autorelease];
}
myMethod 的调用者如果想要获得返回值的所有权,则将 retain 返回值,否则忽略它。当当前NSAutoreleasePool 耗尽时,myObj 将收到一条释放消息。如果没有其他对象拥有它(即已向其发送retain 消息),它将被释放。
所有这些都在 Cocoa Memory Management Programming Guide 中进行了解释。即使你已经读过它,它总是值得再读一遍。
所以,回答你的问题:
首先,您应该释放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];
}
}
你还必须记得在dealloc方法中releaseaccountDictionary:
- (void)dealloc {
[accountDictionary release];
[super dealloc];
}
由于您似乎在使用 NSViewController,我假设您使用的是 Leopard (OS X 10.5),在这种情况下,您可能应该使用 @property 和 @synthesized getter/setter(如果可能)。为此,请添加一个
@property (copy,readwrite) NSDictionary * accountDictionary;
向@interface 类声明。并在您的控制器类的@implementation 块中添加@synthesize accountDictionary; 指令。