iphone - 在 Objective C 中直接访问 iVariable 是一个好方法吗?

标签 iphone ios ios5

<分区>

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

最佳答案

在第一种情况下,编译器已经添加了默认的@synthesize var=_var;,因此您可以省略它。这是Clang extension

Clang provides support for autosynthesis of declared properties. Using this feature, clang provides default synthesis of those properties not declared @dynamic and not having user provided backing getter and setter methods.

在第二种情况下,您使用的是 ivar 和同名的属性。这通常会输出编译器警告:

warning: Autosynthesized property 'loginDataManager' will use synthesized instance variable '_loginDataManager', not existing instance variable 'loginDataManager'.

但是,您添加了 @synthesize loginDataManager 以避免出现警告。

回答你的问题

  • 除了无法在 @property 语句中指定属性(强、弱等)之外,使用或不使用 @property 没有任何区别。
  • 直接访问 ivar 可以避免通过 getter/setter。如果您正在编写构造函数并希望避免在对象初始化期间产生副作用,这是一件好事。在它们之外通常是一件坏事,因为程序可能依赖访问器来执行 KVO/KVC 或其他操作。但如果您自己编写代码并且知道访问器的作用,那么这就是一个选择。

更新

如果您使用 ARC(您应该),对象默认在其使用范围内保留为强。意思是,ARC会自动处理保留/释放,并且编写以下任何内容都没有区别:

@property(strong) NSObject *o; 
__strong NSObject *o;
NSObject *o;

此外,无论您使用 self.o_oo 访问,都没有区别。完全一样。

但是,如果您使用其他人的代码,并且该人在访问器方法中编写了其他内容,则您必须编写 self.o 才能运行该代码。因此,一般来说,在构造函数外部访问变量时,首选 self.ivar:

-(NSObject*) o {
    /* ... some other code that needs to run when you access o */
    return o;
}

如果您不使用 ARC,则需要编写 self.ivar 以便访问器正确保留和释放对象。最新 Xcode 创建的现代项目默认使用 ARC。

关于iphone - 在 Objective C 中直接访问 iVariable 是一个好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15612722/

上一篇:ios - iOS 中多部分表单数据请求的库

下一篇:ios - 将大视频从 PhotoLibrary 上传到服务器

相关文章:

iPhone 删除 &lt;![CDATA

html - 微信不会重定向到 iPhone 上的 iTunes 应用商店

ios - 如何删除 Swift 中节的所有行

ios - iOS 7 中的长屏幕标题缺少后退按钮标题

iOS 无法检查对象是否为空

ios - 更新核心数据的特定属性

iphone - MKMapView 的圆角

iphone - 如何从单 View 应用程序启动 cocos2D 游戏

ios - 如何在 iOS 设备上滚动时保持动画 gif 动画?

uitableview - iOS5中UITableViewCell的分隔符没有隐藏