我认为我在大多数情况下理解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'?
我在随机场合看到的是,在从另一个视图返回后填充表时,视图有时会将“名称”字段显示为空。这可能是另一个问题,但我想确定我使用'autorelease'。
我的问题的核心是在getPlayerName中使用'autorelease'。 'autorelease'状态是否通过方法getPlayerNameByIndex传递给调用者?
或者,我是否必须在中间方法中调用'retain'?我在想'autorelease'可能会在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”方法,它从核心数据加载信息。从答案听起来我不需要调用[播放器保留],因为它是一个自动关联的对象,我可以简单地返回“播放器”并使用它?感谢您的回复!
答案 0 :(得分:2)
我的问题的核心是在getPlayerName中使用'autorelease'。 'autorelease'状态是否通过方法getPlayerNameByIndex传递给调用者?
答案是肯定的。
或者,我是否必须在中间方法中调用'retain'?
是否要调用retain
取决于方法的语义。
在Obj-C / Cocoa中,适用以下约定:名称以“alloc”或“new”开头或包含“copy”的方法将返回retained
个对象;否则你可能会得到一个autoreleased
对象,那么调用者有责任根据需要保留它。
我在想'autorelease'可能会在getPlayerNameByIndex方法中释放。
自动释放的对象在自动释放池耗尽时的下一个时间点释放;这通常与返回主循环有关(但是,没有关于此的详细信息);所以你可以非常肯定自动释放不会在getPlayerNameByIndex
...
希望这有助于澄清问题......
答案 1 :(得分:2)
在getPlayerNameByIndex
行:
[player release];
是wong,删除它。你没有获得所有权。通过使用alloc调用方法或方法名称以new,copy或explicit retain开头,可以获得所有权。 (NARC)。
您不需要发布播放器,因为您没有获得所有权,请参阅上述规则。
getPlayerName:
可以简化为:
return player.nickname;
方法名称可以简化为:
+ (NSString *)getPlayerName:(Player *)player