Чтобы вызвать синтезированный метод доступа внутри самого класса, вы должны использовать self
. Если вы этого не сделаете, вы получите доступ к адресу атрибута напрямую, минуя методы доступа. Вам нужно:
NSString *abc = @"Hardik";
[self.array addobject:abc];
NSLog(@"array = %@", self.array);
Причина, по которой это важно, заключается в том, что синтезированные методы обычно также инициализируют свойство. Внутренние элементы метода синтезированного массива будут выглядеть примерно так:
-(NSArray *) array{
if (array!=nil) {
return array;
}
array=[[NSMutableArray alloc] initWithCapacity:1];
return array;
}
self.propertyName
- это просто сокращение для [self propertyName]
, а self.propertyName=someValue
- просто сокращение для [self setPropertyName:someValue]
.
Пока вы не вызовете self.array
хотя бы один раз, свойство массива не будет инициализировано .
Однако, просто чтобы запутать вещи, после того как вы позвонили self.array
, как только он был инициализирован, вы можете просто позвонить array
напрямую. Итак ...
[self.array addObject:abc];
NSLog(@"array = %@", array);
... работает, в то время как обратное будет возвращать только пустой массив.
Итак, правила таковы:
- В реализации класса
(включая подклассы), вызывая просто
propertyName
дает вам адрес
собственности, но не называет
методы доступа методов получения / установки.
- В реализации класса
(включая подклассы), используя
self.propertyName
вызывает
методы доступа getter / setter но
не имеет доступа к атрибуту напрямую.
- извне класса
реализация, например
myClass.propertyName
вызывает
методы доступа для получения / установки.