使用executeFetchRequest返回对象的方法

时间:2012-03-29 00:28:36

标签: objective-c core-data

我搜索了过去几个小时,在目标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等的所有其他帖子

我只需要一个简单的例子,以便我可以从中获得理解。如果你也可以给我看一个调用这种方法的接收器的例子,我将不胜感激。

谢谢!

1 个答案:

答案 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的类中,您需要确定是否要保留返回的播放器(例如将其设置为保留属性),或者是否要保留原样(自动释放) ,因此可能会在此调用所在的方法完成后释放。如果您只需要立即执行一些操作而不需要在此之后继续操作,请使用此方法。