NSManagedObject сохраняет свой NSManagedObjectContext? - PullRequest
4 голосов
/ 05 декабря 2011

NSManagedObject предоставляет доступ к своему NSManagedObjectContext, но сохраняет ли он его?

Согласно "Обход NSManagedObjectContext на iOS" Маркуса Зарры , «NSManagedObject сохраняет ссылку на свой NSManagedObjectContext внутри, и мы можем получить к нему доступ».

Откуда Зарра знает это и прав ли он?

Я спрашиваю, потому чтоЯ хочу знать, будет ли NSManagedObjectContext dealloc 'в методе tearDown ниже.(Я использую CocoaPlant .)

#import <SenTestingKit/SenTestingKit.h>
#import <CocoaPlant/CocoaPlant.h>

#import "AccountUser.h"

@interface AccountUserTests : SenTestCase {
    AccountUser *accountUser;
}
@end

@implementation AccountUserTests

- (void)setUp {
    accountUser = [AccountUser insertIntoManagedObjectContext:
                   [NSManagedObjectContext contextWithStoreType:NSInMemoryStoreType error:NULL]];
}

- (void)tearDown {
    [accountUser delete];
}

- (void)testFetchWithLinkedAccountUserID {    
    // Tests go here...
}

@end

Ответы [ 3 ]

8 голосов
/ 14 августа 2013

NSManagedObject НЕ содержит строгой ссылки на свой NSManagedObjectContext.Я проверил это в тестовом проекте.Следовательно, вы должны сохранять строгую ссылку на NSManagedObjectContext, пока вы используете его объекты.

4 голосов
/ 14 января 2014

Ух ты, старше двух лет и здесь не принято ответа:)

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

В любом случае, то, что МО хранится в МО, не имеет отношения к дизайну вашего приложения. Если вам нужно, чтобы MOC оставался рядом, вам нужно сохранить его (теперь он называется сильной ссылкой), иначе он исчезнет. То, что фреймворки делают внутри, не наша проблема. Нам просто нужно убедиться, что мы уравновешиваем наши удержания и выпуски.

3 голосов
/ 05 декабря 2011

Матовый,

Я думаю, что Маркус, возможно, неправильно написал, что NSManagedObject сохраняет свой контекст. Каждый NSManagedObject поддерживает ссылку на контекст. Если отдельные объекты не имеют внутреннего цикла сохранения или не сохраняются вне контекста, то, по моему опыту, все они освобождаются при освобождении контекста. Если бы они сохранили контекст, то это почти наверняка было бы не так.

Выше было сказано, что вы можете легко написать код для проверки претензии Маркуса. Переопределите -dealloc и войдите, когда он вызывается.

ИМО, лучше всего сохранять свой контекст, пока вы не покончили с этим. В зависимости от недокументированного поведения, вероятно, не разумно.

Andrew

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