0

1) 直接访问 iVar 是一种好方法吗?

2)以下哪种方法最好?

@interface Some
@property (nonatomic, strong) NSString *loginDataManager;
@end

@implementation Some
@synthesize loginDataManager = _loginDataManager;
@end


@interface Some {
    NSString *loginDataManager;
}
@property (nonatomic, strong) NSString *loginDataManager;
@end

@implementation Some
@synthesize loginDataManager;
@end
4

1 回答 1

1

在第一种情况下,编译器已经添加了默认值@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。

于 2013-03-25T11:45:17.363 回答