Да, это может взорваться. Рассмотрим пример кода.
[self.obj release];
self.obj = nil;
Вы используете self.obj
, что означает, что вы ссылаетесь на методы accessor / mutators вместо прямого доступа к вашему объекту. Скорее всего, вы бы объявили «объект» в качестве оставшейся собственности. Ваш .h будет что-то вроде ...
@property (retain) Something *obj;
и ваш .m
@synthesize obj;
Если вы позже отпустите свой объект, используя методы, созданные вашим @synthesize
, вы в безопасности.
[self setObj:nil];
// or equally valid
self.obj = nil;
// Below is (almost) identical way to access, release and nil the variable directly.
// The major difference is you don't multi-threaded protection of your property
// declaration (explained below).
[obj release];
obj = nil;
Если вы посмотрите на свойство, которое я указал выше, вы заметите, что я не включил в него очень часто встречающееся nonatomic
. Это было не случайно. Взгляните на Apple документы
Свойства являются атомарными по умолчанию, так что синтезированные методы доступа обеспечивают надежный доступ к свойствам в многопоточной среде, то есть значение, возвращаемое из метода получения или устанавливаемое через установщик, всегда полностью извлекается или устанавливается независимо от того, какие другие потоки выполняются одновременно .