Я использую NSThread следующимNSThread Утечка памяти
NSThread * thread = [[NSThread alloc] initWithTarget:object selector:@selector(bg) object:nil];
[thread start];
Позже я хочу, чтобы остановить поток и освободить объект следующим образом:
[thread cancel];
[object release];
Это, кажется, работает нормально. Однако, когда я смотрю на инструмент утечек, я вижу, что некоторые загадочные утечки не приходят никуда от моего кода (пустой NSArray). Когда я смотрел историю malloc, я вижу, что NSArray выделяется в методе «willChangeValueForKey», который в конечном итоге называется моим [object dealloc]. Дело в том, что делегирование делегата равно нулю. Этот делегат наблюдается (поэтому willChangeValueForKey?). [Object dealloc] вызывается из [NSThread exit].
Я предполагаю, что это потому, что [thread cancel] не вращает нить сразу (в конце концов, это в другом потоке). И затем мы отпускаем объект на основной поток. Это оставляет значение keepCount в 1. Затем NSThread освободит объект, когда он действительно начнет вращаться. Похоже, что это вызывает утечку. Я попытался это быстрое изменение, чтобы подтвердить свое предположение:
[thread cancel];
[NSThread sleepForTimeInterval:1];
// This makes it wait until the thread releases [object]
[object release];
Вопрос: почему это небезопасно позволить NSThread освободить свой объект? Это связано с тем, что код наблюдателя небезопасен в dealloc?
Выполняется ли ваше 'willChange' /' didChange' в том же потоке, что 'addObserver:' и 'removeObserver:' вызывается? – iluvcapra
Есть ли в вашей ветке собственный автореферат? –
autoreleasepool: да. Что касается вопроса iluvcapra: я не уверен. Этот фрагмент кода довольно сложный, поэтому я не уверен на 100%. Могут ли иметь их на разных потоках вызвать утечку? – George