簡體   English   中英

通過使用保留來獲得自動釋放對象的所有權?

[英]Taking ownership of autorelease objects by using retain?

解決以下問題的正確方法是什么? 為了獲得帶有CoreData對象的列表,我有一個“數據管理器”,在其中創建一個NSFetchResultController,進行搜索,並與這些對象一起生成NSFetchResultsController。

由於可以有多個表,因此在每個請求上都需要創建一個新的FetchedResultsController,以允許自動更新與它們關聯的tableView。

我要做的是在DataManager中創建FetchedResultController,然后自動釋放它。 在TableViewController中,我保留了它(假設它將擁有它的所有權)。

    NSFetchedResultsController* objects = [[delegate dataManager] getMenu:parentMenu];        
    _objects = [objects retain];

這將調用DataManager:

- (NSFetchedResultsController*) getMenu:(DOMenuItem*) parentMenu {
    NSPredicate* predicate;
    if(parentMenu == nil){
        predicate = [NSPredicate predicateWithFormat:@"(parent == NULL)", parentMenu];
    } else {     
        predicate = [NSPredicate predicateWithFormat:@"(parent == %@)", parentMenu];    
    }

    [NSFetchedResultsController deleteCacheWithName:_cacheName];

    NSFetchedResultsController* aFetchedResultsController = [self createFetchedResultsController];    
    [aFetchedResultsController.fetchRequest setPredicate:predicate];
    [aFetchedResultsController.fetchRequest setFetchLimit:0];

    NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:_defaultSortField ascending:YES] autorelease];
    NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortDescriptor, nil] autorelease];

    [aFetchedResultsController.fetchRequest setSortDescriptors:sortDescriptors];        

    // Fetch the records and handle an error
    NSError *fetchError;

    if (![aFetchedResultsController performFetch:&fetchError]) {
        // Handle the error.
        // This is a serious error and should advise the user to restart the application
        NSLog(@"Fetching data error: %@", [fetchError localizedDescription]);
    }

    return aFetchedResultsController;    
} 

- (NSFetchedResultsController *) createFetchedResultsController {     
    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
    NSEntityDescription *entity = [NSEntityDescription entityForName:_objectName inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:_defaultSortField ascending:NO] autorelease];
    NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortDescriptor, nil] autorelease];

    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[self managedObjectContext] sectionNameKeyPath:_sectionNameKeyPath cacheName:_cacheName];

    return [aFetchedResultsController autorelease];
} 

但是,我在這樣的情況下運行,即在該FetchedResultController上的在線調用中出現Dealloc錯誤。

if(indexPath.section == [[_objects sections] count] + 1){

消息是:

* -[NSFetchedResultsController部分]:消息發送到已釋放實例0xe3de1b0

這種方法有什么問題嗎? 如果是這樣,將所有權從創建類“轉移”到需要保留它的類的首選方法是什么。

編輯:當我在返回fetchedResultsController時放置“保留”而不是“自動釋放”時,一切正常,但是由於“所有者”不會釋放對象,因此這似乎不是正確的編碼習慣。 我認為'copy'不能與ManagedObjects兼容,還是可以?

在非ARC環境中,正確的方法是返回自動釋放的對象,然后,如果對象的使用將持續超出接收過程(以及遞歸調用該對象的過程)的范圍,則返回最近的對象自動釋放邊界),則應保留對象,並規定(通常在“擁有”對象的dealloc方法中)以1對1的方式釋放保留。

請注意,在有條件地保留對象的情況下,請務必小心-不要釋放未保留的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM