【发布时间】:2011-10-03 16:21:29
【问题描述】:
我想我大部分都了解 Objective-C 中的保留/释放。但是,我有一个我不确定的具体案例。这是一个例子:
+ (NSString *)getPlayerNameByIndex:(NSInteger)globalIndex:(ABAddressBookRef)addressBook
{
...
Player *player = [PlayerHelper loadPlayer:globalIndex];
NSString *name = [PlayerHelper getPlayerName:player :addressBook];
[player release];
// 'retain' here?
return name;
}
+ (NSString *)getPlayerName:(Player *)player:(ABAddressBookRef)addressBook
{
...
NSString *name = [[[NSString alloc] initWithString:player.nickname] autorelease];
return name;
}
所以我打电话给...
NSString *name = [PlayerHelper getPlayerNameByIndex:index:addressBook];
// name is 'autorelease'?
我在随机场合看到的是,视图有时会在从另一个视图返回后填充表格时将“名称”字段显示为空。这可能是另一个问题,但我想确定我使用了“自动释放”。
我的问题的核心是在 getPlayerName 中使用“自动释放”。 'autorelease' 状态是否通过 getPlayerNameByIndex 方法传递给调用者?
或者,我必须在中间方法中调用“保留”吗?我在想“自动释放”可能会在 getPlayerNameByIndex 方法中释放。
希望我的问题很清楚。任何帮助表示赞赏。
更新:更多信息以供澄清......
NSError *error = nil;
Player *player = nil;
NSArray *array = [appDelegate.managedObjectContext executeFetchRequest:request error:&error];
if ([array count] == 1)
{
player = [array objectAtIndex:0];
[player retain];
}
这本质上是从核心数据加载信息的“loadPlayer”方法。从答案听起来我不需要调用[player retain],因为它是一个自动相关的对象,我可以简单地返回“player”并使用它?感谢您的回复!
【问题讨论】:
-
静态分析器为您提供帮助!
-
我会马上去看看贾斯汀..谢谢!
-
静态分析器很漂亮!我不知道为什么我没有使用它。我确实使用泄漏检查器。正在处理这个问题。
-
是的,它可以快速指出编译器可能遗漏的很多问题,并为您节省大量时间。