2012-03-29 3 views
0

Я искал последние пару часов, читая десятки сообщений по теме управления памятью в объективе C, и я просто не понимаю. Сожалею. Я делаю все что в моих силах!Метод, возвращающий объект с executeFetchRequest

В настоящее время я ищу ответ на вопрос о том, как вернуть объект из метода, который вызывает «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, копировать, новый и т.д.

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

Спасибо!

ответ

1

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

В классе, который вы вызываете + (Player *)loadPlayerWithPredicate:(NSString *)name:(NSInteger)index, вам нужно будет определить, хотите ли вы сохранить возвращенный Player (например, установить его в свойство сохранения), или если вы хотите оставить его как есть (автореализован и, следовательно, скорее всего, будет выпущен после того, как метод, в котором работает этот вызов, завершился. Используйте это, если вам нужно выполнить сразу несколько действий с ним, и после этого не нужно его удерживать).

Смежные вопросы