2010-10-29 3 views
0

Я анализировал свое приложение с утечками, и я заметил, что какой-то основной объект данных протекает, как может утечка NSManagedObject? Я думал, что это управляется операционной системой? Известны ли утечки в основных данных? Линия, которая Утечка говорит вызывает утечкаОсновные данные iOS Как он может протекать?

NSMutableArray *e=[NSMutableArray arrayWithArray:[[user videos] allObjects]]; 
    //the line above^is pointed to by leaks as generating a leak 
for(VideoEntity * v in e) 
{ 
    UploadThread *ut= [[UploadThread alloc] init]; 
    [ut setVideoEntity:v]; 
    [threads addObject:ut]; 
    [ut release]; 
} 

Где пользователь управляемый объект, который содержит VideoEntity как отношение ко многим, и я назначить VideoEntitys в некоторые потоки для работы на ... Утечке говорит VideoEntity является протечки.

У кого-нибудь есть вход?

ответ

1

UploadThread может сохранять и не выпускать его. Да, NSManagedObjects может протекать. Это просто объекты. Они являются частью одного и того же управления памятью, которые использует остальная часть системы.

+0

Thats intersting points, хотя я не предполагал сохранять или освобождать управляемые объекты, но установщик для UploadThread объявляется как сохранение, чего, вероятно, не должно быть! Удержание вызова действительно имеет утечку (память не перераспределяется), хотя объект все еще управляется системой? – Daniel

+1

Нет, вы определенно должны сохранить/освободить их. Они являются нормальными объектами obj-c, у них просто есть дополнительное управление, выполняемое контекстом. Если вы не сохраняете/не отпускаете объекты, они могут оставаться рядом или они могут исчезнуть из-под вас, в зависимости от того, решает ли контекст удерживать их или нет. Вы должны игнорировать контекст, думая об управлении памятью на них, и просто относитесь к ним, как к любому другому объекту модели. –

1

Управляемые объекты, имеющие отношения, имеют неявные циклы удержания (т. Е. Обе стороны отношения сохраняют свои объекты). Как только вы ошиблись в отношениях, вы создаете этот цикл сохранения. Чтобы сломать его, вам нужно позвонить -[ManagedObjectContext refreshObject:mergeChanges:], чтобы повторно разбить объект и разбить циклы сохранения.

Для получения дополнительной информации см. Раздел управления памятью Core Data Programing Guide.

Кроме того, если вы отправляете экземпляры управляемых объектов по потокам, вы не должны быть. Вместо этого следует использовать идентификатор объекта (это поточно-безопасный).

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