Objective c 方法返回带有executeFetchRequest的对象
在过去的几个小时里,我阅读了几十篇关于objective-C中内存管理主题的帖子,但我就是不明白。很抱歉我正在尽我最大的努力 我目前正在寻找的是如何从调用“executeFetchRequest”的方法返回对象的答案 这里有一些代码Objective c 方法返回带有executeFetchRequest的对象,objective-c,core-data,Objective C,Core Data,在过去的几个小时里,我阅读了几十篇关于objective-C中内存管理主题的帖子,但我就是不明白。很抱歉我正在尽我最大的努力 我目前正在寻找的是如何从调用“executeFetchRequest”的方法返回对象的答案 这里有一些代码 + (Player *)loadPlayerWithPredicate:(NSString *)name:(NSInteger)index { NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEn
+ (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;
}
但我真正需要的是在方法返回后让“player”对象保持不变
“玩家”归来后,我怎样才能让它活下来
我应该叫“保留”吗?(然后我会在接收器中调用“release”)
我应该“复制”对象吗
我读了所有其他关于alloc、copy、new等的帖子
我只需要一个简单的例子,这样我就可以从中得到理解。如果你也能给我一个例子,说明接收者调用这个方法,我将不胜感激
谢谢 您可以使用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
的类中,您需要确定是否要保留返回的播放机(例如将其设置为retain属性),或者是否要保持原样(自动释放,因此可能会在该调用所在的方法完成后释放。如果您只需要立即对其执行一些操作,而不需要在之后保留它,请使用此选项)