Есть ли способ проверить, находится ли экземпляр в памяти? - PullRequest
2 голосов
/ 25 февраля 2010

Пример: у меня есть контроллер вида и я от него избавляюсь. Но есть еще переменная, хранящая свой адрес памяти. Доступ к этому приводит к EXEC_BAD_ACCESS. Конечно. Но: есть ли способ проверить, действительна ли эта переменная? т.е. если он все еще указывает на то, что существует в памяти?

Ответы [ 4 ]

18 голосов
/ 25 февраля 2010

Вы должны прочитать это снова:

Руководство по управлению памятью какао

Короче говоря, если вы хотите, чтобы что-то прилипло к вам должно retain it.

Если вы хотите, чтобы что-то ушло , и вы ранее сохранили это , вы должны release или autorelease.

Вы никогда не должны вызывать dealloc напрямую (за исключением [super dealloc]; в конце каждого из ваших dealloc методов).

Вы никогда не должны release или autorelease объект, который вы не retain.

Обратите внимание, что некоторые методы do возвращают сохраненные объекты, которые вы должны release. Если вы alloc экземпляр класса, это означает retain. Если у вас copy и экземпляр, копия сохраняется.

Если вы когда-нибудь испытываете желание использовать метод retainCount, не делайте этого. Это не полезно. Рассматривать только считать считать как дельту; если вы добавите, вы должны вычесть, но абсолютное значение - это деталь реализации, которую следует игнорировать.

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

Да, и используйте функцию Построить и проанализировать в XCode. Он отлично справляется с задачами по управлению памятью, но не совсем идеально.

2 голосов
/ 25 февраля 2010

Это то, для чего настроена вся модель управления памятью - если вы позвоните retain в нужное время, а release и autorelease в нужное время, этого не произойдет. Вы можете использовать NSZombie, чтобы помочь вам в отладке.

1 голос
/ 26 февраля 2010

Использовать точку останова "NSZombieEnabled".

По этой причине только все настоятельно рекомендуют нам использовать средства доступа. Если ваш объект где-либо освобожден, он будет присвоен nil, и не будет никакого вреда, если вы вызовете какой-либо API или метод для объекта Nil. Поэтому, пожалуйста, приобретите привычку использовать аксессоры.

вы просто добавляете этот NSZombieEnabled Flag в качестве аргумента в ваше приложение в настройках сборки. и включите его. Теперь вы запускаете ваше приложение в режиме отладки. Если произойдет любое такое падение, эта точка останова покажет вам, какой объект освобожден и где он падает.

Ура, Manjunath

0 голосов
/ 25 февраля 2010

Если под переменной вы подразумеваете, ссылается ли указатель на ваш объект на действительную память, то:

MyClass * myVariable = [[MyClass alloc] init];

// Тонны вещей случаются ...

if (myVariable! = Nil) // Делаем больше вещей

...