NSArray (и другие типы Какао) @property значения - PullRequest
2 голосов
/ 24 февраля 2011

В процессе отладки кода, написанного коллегой, я наткнулся на следующее, что меня озадачило:

NSMutableArray *array = [NSMutableArray array];
NSUInteger arrayCount = array.count;

Почему это работает? Это также работает для NSDictionary и других типов, но нигде в документации, ни в заголовках Какао, эти определения @property не могут быть найдены.

Поиск в Google по "свойству NSArray" не дает много полезных результатов, поэтому я обращаюсь к SO по поводу того, что, несомненно, будет очень смущающим вопросом.

Ответы [ 2 ]

6 голосов
/ 24 февраля 2011

Это работает, потому что синтаксис точки не имеет ничего общего со свойствами. Это просто синтаксический сахар (хотя мне это не нравится, так что, возможно, это "синтаксическая соль").

Когда вы используете точечный синтаксис в качестве r-значения выражения (или выражения справа от знака равенства), он просто поворачивается:

bar = myObject.thing;

В

bar = [myObject thing];

Когда точка находится слева от знака равенства (как l-значение), она превращается в установщик. Итак:

myObject.thing = 42;

Становится

[myObject setThing:42];

Так что да, вы можете делать такие вещи, как myObject.retain. Но вы никогда не должны делать это . Вы должны когда-либо использовать точечный синтаксис только в качестве средства доступа к объявленным свойствам (то есть вещам, которые были явно объявлены через @property). <вставить замечание о том, что вам никогда не следует использовать точечный синтаксис.>

Для получения дополнительной информации ознакомьтесь с документацией по синтаксису точки (в частности, раздел "неправильное использование").

2 голосов
/ 24 февраля 2011

синтаксис точки на самом деле является просто альтернативой для доступа к методам, которые либо не принимают параметров, либо возвращают значение, например array.count.Это плохой способ на самом деле получить доступ к методам таким способом.

Он также может быть использован для таких вещей, как [объект setValue: (id) что-то] и доступ к нему с помощью object.setValue = что-то;

...