Метод, возвращающий объект с executeFetchRequest - PullRequest
0 голосов
/ 29 марта 2012

Я искал последние пару часов, читая десятки сообщений на тему управления памятью в target-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;
}

Но что мне действительно нужно, чтобы объект "игрок" оставался после возвращения метода.

Как я могу заставить игрока "жить" после возвращения?

Должен ли я назвать «сохранить»?(и тогда я бы назвал «release» в получателе). Должен ли я «скопировать» объект?

Я прочитал все остальные посты о alloc, copy, new и т. д.

IМне нужен простой пример, чтобы я мог понять его.Если вы также можете показать мне пример получателя, вызывающего этот метод, я был бы признателен.

Спасибо!

1 Ответ

1 голос
/ 29 марта 2012

Вы можете использовать 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, вам нужно будет определить, хотите ли вы сохранить возвращенного Игрока (например, установить его для свойства сохранения), или вы хотите оставить его как есть (автоматически освобожден, и, таким образом,вероятно, будет выпущен после того, как метод, в котором этот вызов завершен, используйте его, если вам нужно только выполнить несколько действий с ним немедленно и не нужно удерживать его после).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...