在第一种情况下,编译器已经添加了默认值@synthesize var=_var;
,因此您可以省略它。这是一个Clang 扩展
Clang 提供对声明属性的自动合成的支持。使用此功能,clang 提供了那些未声明 @dynamic 并且没有用户提供支持 getter 和 setter 方法的属性的默认合成。
在第二种情况下,您使用的是 ivar 和同名的属性。这通常会输出编译器警告:
警告:自动合成的属性“loginDataManager”将使用合成的实例变量“_loginDataManager”,而不是现有的实例变量“loginDataManager”。
但是,您添加了@synthesize loginDataManager
以避免警告。
回答你的问题,
- 除了不能在@property 语句中指定属性(强、弱、...)之外,是否使用@property 没有区别。
- 直接访问 ivar 可以避免通过 getter/setter。如果您正在编写构造函数并希望在对象初始化期间避免副作用,这是一件好事。而且在它们之外通常是一件坏事,因为程序可能依赖访问器来执行 KVO/KVC 或其他操作。但是,如果您自己编写代码并且您知道访问器做什么,那么这是一个选择。
更新
如果您使用 ARC(您应该),对象默认在其使用范围内保持强。意思是,ARC 自动处理保留/释放,编写以下任何内容都没有区别:
@property(strong) NSObject *o;
__strong NSObject *o;
NSObject *o;
self.o
此外,使用、 或_o
、 或访问也没有区别o
。完全一样。
但是,如果您正在使用其他人的代码,并且该人在访问器方法中编写了其他内容,则您必须编写self.o
该代码才能运行。所以一般来说,在构造函数之外访问变量时,self.ivar 是首选:
-(NSObject*) o {
/* ... some other code that needs to run when you access o */
return o;
}
如果您不使用 ARC,那么您需要编写 self.ivar 以便访问器正确地保留和释放对象。最新 Xcode 创建的现代项目默认使用 ARC。