gpt4 book ai didi

iphone - Objective-C Setter 内存管理

转载 作者:行者123 更新时间:2023-12-03 20:17:47 27 4
gpt4 key购买 nike

对 Objective-C 内存管理还是有点困惑。我认为我的困惑源于自动释放的确切含义。

NSString *theBackendResponse = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding];
NSDictionary *accountDictionary = [theBackendResponse propertyList];
[viewController setAccountDictionary:accountDictionary];

现在,我应该如何处理 View Controller 的 setAccountDictionary 方法中的 accountDictionary?现在我只是将实例变量“accountDictionary”设置为返回的值。我应该将其设置为保留的,然后释放返回的吗?鉴于 NSString 的 propertyList 方法是自动释放的,我的 setter 代码块应该是什么样子?

顺便问一下,如果我释放了BackendResponse,我会丢失accountDictionary吗?我想不会...

最佳答案

调用[objectInstance autorelease]将一个对象添加到当前的NSAutoreleasePool。当该池收到 drain 消息时,它会向池中的所有对象发送 release。如果这些对象中的任何一个的保留计数达到 0,则它们将在此时被释放。自动释放的目的是允许您标记要在“将来的某个时间”释放的对象。这对于返回新分配的对象但想要释放它以便调用者不必取得返回对象的所有权的方法特别有用。方法可能如下所示:

- (id)myMethod {
id myObj = [[SomeClass alloc] init];

...

return [myObj autorelease];
}

如果 myMethod 的调用者想要获得返回值的所有权,则他们将保留返回值,如果不想,则忽略它。当当前的 NSAutoreleasePool 耗尽时,myObj 将收到释放消息。如果没有其他对象拥有它(即已向其发送了 retain 消息),它将被释放。

所有这一切都在 Cocoa Memory Management Programming Guide 中进行了解释。 。即使您已经读过它,它仍然值得再读一遍。

那么,回答你的问题:

首先,您应该释放theBackendResponse。如果不这样做,你就会泄漏内存。您不需要知道 accountDictionary 对字符串做了什么:如果它需要保留引用,它将保留 theBackendResponse。您拥有 theBackendResponse 的所有权,因为您分配了它,因此您必须放弃该所有权(通过 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 方法中释放 accountDictionary:

- (void)dealloc {
[accountDictionary release];
[super dealloc];
}

由于您似乎正在使用 NSViewController,我假设您使用的是 Leopard (OS X 10.5),在这种情况下,您可能应该使用 @property 和如果可能的话,@synthesized getter/setter。为此,请添加一个

@property (copy,readwrite) NSDictionary * accountDictionary; 

对类@interface的声明。并在 Controller 类的 @implementation block 中添加 @synthesize accountDictionary; 指令。

关于iphone - Objective-C Setter 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/971220/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com