Objective c 只读属性、方法和点语法

Objective c 只读属性、方法和点语法,objective-c,properties,Objective C,Properties,请告诉我以下几点: Q1-就访问属性时生成的代码而言,以下三种声明之间的本质区别是什么 @property (nonatomic, readonly, getter = getMyProp) NSString* myProp; @property (readonly, getter = getMyProp) NSString* myProp; - (NSString*) myProp; Q2-在所有情况下[object myProp]是否完全等同于object.myProp(假设编译器没有抱怨

请告诉我以下几点:

Q1-就访问属性时生成的代码而言,以下三种声明之间的本质区别是什么

@property (nonatomic, readonly, getter = getMyProp) NSString* myProp;
@property (readonly, getter = getMyProp) NSString* myProp;
- (NSString*) myProp;
Q2-在所有情况下
[object myProp]
是否完全等同于
object.myProp
(假设编译器没有抱怨)

Q3-如果它们是等价的,为什么方括号形式到处都流行,特别是在苹果的示例代码中

谢谢

(1)对于
非原子的
,将直接返回值。对于隐含的
atomic
,返回值将自动删除(在返回前已
retain
ed和
autorelease
d)。对于直接方法声明,将不生成代码

请注意,
getter=getMyProp
完全违背了iOS和OSX编程模式。getter的前缀不是
get

(2)
[对象myProp]
object.myProp
在代码生成时完全等效。但是,在codeine之前的编译过程中,它们并不等效。如果
object
的类型为
id
,编译器将在
object.myProp
上出错。也就是说,点表示法要求显式键入相关的对象,并且肯定实现了上述方法


(3) 大部分示例代码都没有必要更新,并且考虑到点对括号语法是可互换的(2)(但无论如何都不应该使用
id
),一些直到使用括号,甚至在点的光。

getter=getMyProp
是一个明确的信号,表明有人在与系统的标准模式作斗争。getter方法不应该以
get
+1作为前缀。当使用隐含的
原子
时,很高兴了解
保留
自动释放
顺便说一句,我在我的所有属性上都使用了
非原子的
。不确定第二个属性。我会说它是一样的(如果对象类型是id,那么调用[object myProp]也会出错,但如果调用[object performSelector:@selector(myProp)]则不会.无论如何,根据苹果的文档,词法分析器使用它们是一样的,不是吗?@AlejandroIván Nope;不一样。dot需要特定类型(类或协议)而使用带括号的语法的
id
,只要在以前看到的任何头文件中的某处、任何地方声明了该方法,则编译时不会发出警告。@bbum,感谢您的详细回答。关于(1)如果没有基本的ivar,那么非原子的就不重要了,是吗?@mojuba Correct--
nonatomic
如果手动实现setter/getter,则什么都不做。也就是说,
nonatomic
只有在编译器合成方法时才重要。