通过中间方法保留/释放

时间:2011-10-03 16:21:29

标签: objective-c autorelease

我认为我在大多数情况下理解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”方法,它从核心数据加载信息。从答案听起来我不需要调用[播放器保留],因为它是一个自动关联的对象,我可以简单地返回“播放器”并使用它?感谢您的回复!

2 个答案:

答案 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