Разница между доступом к элементам данных класса с использованием self и без него - PullRequest
0 голосов
/ 06 ноября 2011

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

@interface MyClass:UIViewController
{
IBOutlet UILabel *label;
}
@property (nonatomic,retain) IBOutlet UILabel *label;

, есть ли разница между этим

[label release];

и этим

[self.label release];

Ответы [ 2 ]

1 голос
/ 06 ноября 2011

Да, есть разница, когда вы используете свойство, вы неявно используете аксессоры, то есть:

- (UILabel*)label;

Так что в геттере может быть реализовано некоторое дополнительное поведение,например, проверка работоспособности и т. д.

Здесь вы объявили свое свойство как сохраняющее:

@property (nonatomic,retain) IBOutlet UILabel *label;

Таким образом, установщик автоматически сохранит значение для установки и освободит старое.

Использование:

[self.label release];

Вы делаете что-то опасное, когда вы отпускаете объект, который удерживается аксессорами.Поэтому, когда вы делаете что-то вроде:

self.label = nil;

Он вызывает метод - (void) setLabel:(UILabel*)label, который освобождает реальный объект!Таким образом, объект будет освобожден дважды, что приведет к свободному доступу к объекту!

Если вы объявляете свойство, попробуйте использовать только этот член через это свойство!

Вы также можете использовать неявное объявление члена, например:

@interface MyClass

@property (nonatomic, retain) UILabel* label;

@end

@synthesize label = _label;

Член UILabel* _label будет неявно объявлен:)

0 голосов
/ 06 ноября 2011

Да. во втором случае вы используете дополнительные методы. Вы должны использовать либо первый, либо self.label = nil; , а не [self.label release];

Почему вы хотите освободить элемент интерфейса?

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