Objective c NSArray(和其他Cocoa类型)@属性值

Objective c NSArray(和其他Cocoa类型)@属性值,objective-c,cocoa,properties,nsarray,nsdictionary,Objective C,Cocoa,Properties,Nsarray,Nsdictionary,在调试同事编写的代码的过程中,我偶然发现了以下让我感到困惑的问题: NSMutableArray *array = [NSMutableArray array]; NSUInteger arrayCount = array.count; 为什么这样做有效?它也适用于NSDictionary和其他类型,但在文档或Cocoa标题中找不到那些@property定义 用谷歌搜索“NSArray属性”并不会产生很多有用的结果,所以我想问一个非常尴尬的问题。点语法实际上只是访问方法的一种替代方法,这些方法

在调试同事编写的代码的过程中,我偶然发现了以下让我感到困惑的问题:

NSMutableArray *array = [NSMutableArray array];
NSUInteger arrayCount = array.count;
为什么这样做有效?它也适用于
NSDictionary
和其他类型,但在文档或Cocoa标题中找不到那些
@property
定义


用谷歌搜索“NSArray属性”并不会产生很多有用的结果,所以我想问一个非常尴尬的问题。点语法实际上只是访问方法的一种替代方法,这些方法要么不带参数,要么返回array.count这样的值。以这种方式实际访问方法是不好的


它还可以用于[object setValue:(id)something]之类的操作,并通过执行object.setValue=something来访问它

之所以有效,是因为点语法与属性无关。它只是语法上的糖分(虽然我不喜欢它,所以可能是“语法上的盐”)

使用点语法作为表达式(或等号右侧的表达式)的右值时,它会简单地转换为:

bar = myObject.thing;
进入

当点位于等号的左侧(作为左值)时,它将其转换为setter。因此:

myObject.thing = 42;
变成

[myObject setThing:42];
因此,是的,您可以执行类似于myObject.retain的操作。但是你永远不应该那样做。您应该只使用点语法作为已声明属性(即通过
@property
显式声明的内容)的访问器


有关更多信息,请签出(特别是“不正确使用”部分)。

感谢您的回复,Dave。我意识到从
bar=myObject.thing看不见的转换
bar=[myObject thing],但我从来没有想过尝试它以外的任何其他财产。我想这是有道理的。出于兴趣:您是不喜欢本例中的点语法(即不是属性)还是一般情况下的点语法?@sasterealien:我不喜欢Objective-C中的点语法。我想这与Objective-C的一般精神是相反的。谢谢您的意见,这是我非常重视的一种语法!
[myObject setThing:42];