当一个方法返回一个取自的对象时,NSMutableArray是否必须自动释放该对象?检查以下方法。我也应该自动释放零值吗?
-(NSObject*)getElementByID:(NSString*)ID{
for(int i=0;i<[elements count];i++){
NSObject *element = (NSObject*) [elements objectAtIndex:i];
if([element.key isEqualToString:ID]){
return [element autorelease];
}
}
return nil;
}
答案 0 :(得分:3)
您不能自动发布element
,因为您不是它的拥有者(您没有保留它)。如果您使用alloc
,new
或retain
获取,则您将成为其所有者。由于您获取此对象调用objectAtIndex:
,因此您不拥有它。见Three Magic Words。在此处调用autorelease
将导致稍后发生崩溃。
您的方法名称不正确并破坏了KVC。以get
开头的方法必须使用将使用结果更新的指针。这应该是elementForID:
。如上所述,使用三个神奇的词语,在ObjC中命名对于编写稳定的代码非常重要
作为旁注,传统上使用id
是大多数情况而不是NSObject*
。它们意味着略有不同,但通常id
是正确的。
答案 1 :(得分:0)
您永远不需要与nil
进行任何与内存管理相关的事情。所以,不,你不应该将autorelease
发送给nil
。
您也不需要将autorelease
发送到您从element
阵列返回的elements
对象。你返回的那个对象将因elements
本身保留它而留在记忆中。如果调用方法希望retain
返回的值,则可能。但是,如果该调用方法仅在其自己的范围内使用返回的值,则在不保留它的情况下这样做是安全的。