属性(property)与成员变量(ivar)有什么区别

最近看了很多别人写的example,一直搞不懂为什么很多人同时写属性和成员变量
如下:

@interface KKProgressToolbar : UIToolbar {
    @private

    id <KKProgressToolbarDelegate> __weak _actionDelegate;

    UIBarButtonItem* _stopButtonItem;
    UIActivityIndicatorView* _activityIndicator;
    UILabel* _statusLabel;
    UIProgressView* _progressBar;
}

@property (nonatomic, strong) UIBarButtonItem *stopButtonItem;
@property (nonatomic, strong) UIActivityIndicatorView *activityIndicator;
@property (nonatomic, strong) UILabel *statusLabel;
@property (nonatomic, strong) UIProgressView *progressBar;

@property (nonatomic, weak) id <KKProgressToolbarDelegate> actionDelegate;

一般我自己写的时候,直接写@property, 然后在m文件中,写上

@synthesize aaaaa = _aaaaa;

我刚开始学IOS,不知道这个的区别是什么,望有人不嫌弃,指点一二,在此谢过!!!

阅读 21.8k
评论
    5 个回答
    liruqi
    • 348

    本质上来讲,属性也会帮你定义一个成员变量,并根据属性的声明自动生成getter/setter 方法,其中setter 方法根据属性(property)的属性(attribute)来提供不同的内存管理策略。

    简单翻译一个SO的答案:Why would you use an ivar?,展开说一下成员变量的好处。

    封装

    如果成员变量是private,程序中的其它对象很难直接访问该成员变量。如果是属性,相对更容易用父类方法读写属性。

    性能

    成员变量地址可以根据实例的内存地址偏移寻址。而属性的读写都需要函数调用,相对更慢。

    非基础类型

    对于复杂的C++类型,往往设为成员变量更合适,也许这种类型不支持copy,或者完全复制很麻烦。

    多线程

    多线程环境下,为保证数据一致性,在需要同步执行的代码段更应该使用成员变量。如果对需要同步更新的数据用getter/setter 方法,数据更新效率低,会带来更多的获取锁请求失败。

    程序正确性

    成员变量可以做直观的内存管理。属性可以一层层继承,还可以复写。容易出错。

    二进制文件的体积

    默认用属性,会生成不必要的getter/setter 方法,程序体积会变大。

    评论 赞赏