我搜索了过去几个小时,在目标C中阅读了几十篇有关内存管理主题的帖子,我只是不明白。抱歉。我正在尽我所能!
目前我正在寻找的是如何从调用'executeFetchRequest'的方法返回一个对象的答案。
这是一些代码......
+ (Player *)loadPlayerWithPredicate:(NSString *)name:(NSInteger)index
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Player" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
// Set filter predicate
NSString *strFilter = [NSString stringWithFormat:@"%@ = %d", name, index];
[request setPredicate:[NSPredicate predicateWithFormat:strFilter]];
// Create the sort descriptors array
NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:name ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sorter]];
NSError *error = nil;
Player *player = nil;
NSArray *array = [managedObjectContext executeFetchRequest:request error:&error];
if ([array count] == 1)
{
player = [array objectAtIndex:0];
//[player retain]; // ???
}
[request release];
return player;
}
但我真正需要的是“玩家”对象在方法返回后留下来。
如何在返回后让“玩家”活着?
我应该叫'保留'吗? (然后我会在接收器中称'释放') 我应该“复制”这个对象吗?
我阅读了有关alloc,copy,new等的所有其他帖子
我只需要一个简单的例子,以便我可以从中获得理解。如果你也可以给我看一个调用这种方法的接收器的例子,我将不胜感激。
谢谢!
答案 0 :(得分:1)
你可以使用copy,但它需要Player
类符合NSCopying
协议,我怀疑它是这样做的。
这里最简单(也可能是最好的)方法就是这样:
if ([array count] == 1)
{
player = [[array objectAtIndex:0] retain];
}
[request release];
return [player autorelease];
通过保留播放器,保持播放器不被释放,然后当您返回播放器时,使用autorelease
。这不是绝对必要的,但我认为在这种情况下它是很好的编程实践。这是因为你的
+ (Player *)loadPlayerWithPredicate:(NSString *)name:(NSInteger)index;
函数名称意味着(在Obj-C标准实践中)返回的对象是自动释放的,因此将对象的内存管理留给调用者。
在您调用+ (Player *)loadPlayerWithPredicate:(NSString *)name:(NSInteger)index
的类中,您需要确定是否要保留返回的播放器(例如将其设置为保留属性),或者是否要保留原样(自动释放) ,因此可能会在此调用所在的方法完成后释放。如果您只需要立即执行一些操作而不需要在此之后继续操作,请使用此方法。