Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 方法返回带有executeFetchRequest的对象_Objective C_Core Data - Fatal编程技术网

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

在过去的几个小时里,我阅读了几十篇关于objective-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;
}
但我真正需要的是在方法返回后让“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属性),或者是否要保持原样(自动释放,因此可能会在该调用所在的方法完成后释放。如果您只需要立即对其执行一些操作,而不需要在之后保留它,请使用此选项)