2012-03-29 83 views
0

我在過去的幾個小時內搜索了幾十個關於Objective-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; 
} 

但我真正需要的是爲「玩家」對象的方法返回後留下來。

我怎樣才能讓'玩家'在返回後生活?

我應該叫'保留'嗎? (然後我會在接收器中調用「釋放」) 我應該「複製」對象嗎?

我看了所有關於頁頭,複製,新的其他職位的,等

我只需要一個簡單的例子,這樣我就可以從中獲得瞭解。如果你也可以給我看一個接收器調用這個方法的例子,我將不勝感激。

謝謝!

回答

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標準的做法)返回的對象會被自動釋放,從而留下了對象的內存管理到調用者。

在您調用+ (Player *)loadPlayerWithPredicate:(NSString *)name:(NSInteger)index的類中,您需要確定是否要保留返回的播放器(例如將其設置爲retain屬性),或者如果您想保持原樣(自動釋放,因此將會在這個調用的方法結束後被釋放,如果你只需立即執行一些操作並且不需要繼續執行,就可以使用它)。

相關問題