Objective-C的属性和成员变量用法及关系浅析

    在使用Objective-C语言进行了一段时间的iOS开发之后,发现自己的语言基础相对薄弱,于是开始弥补自己的短处。我发现在用过一种语言之后,再回过头来看它的很多原理会发现有更加深刻的理解。下面就对一直困惑我的属性和成员变量的用法和关系问题进行浅析,由于水平有限可能会有错误,请看过文章的人多多指正。

1、属性

    关于属性的用法在苹果的官方文档《The Objective-C Programming Language》中有详细的说明,在这里就不再赘述,链接如下:

    《The Objective-c Programming Language》

    如果你的英文不好,没关系,已经有人把这个文档全部翻译完了,链接如下:

    Objective-C编程语言官方文档翻译

2、关于@synthesize object = _object 的解释

    我们在很多代码中会见到这样的写法:

[plain]  view plain copy
  1. @interface MyClass:NSObject{    
  2.         MyObjecct *_object;  
  3. }  
  4. @property(nonamtic, retain) MyObjecct *object;  
  5. @end  
  6.   
  7. @implementatin MyClass  
  8. @synthesize object=_object;  
    我在网上查阅了一些资料和其他人写的博文,总结了这样写的几条原因如下:    

(1)32位系统和64位系统的差异

    在32位系统中,如果类的@interface部分没有进行ivar(instance variable)声明,但有@property声明,在类的@implementation部分有响应的@synthesize,则会得到类似下面的编译错误:

    Synthesize property ‘xX’ must either be named the same as a compatible ivar or must explicitly name an ivar

    在64位系统中,运行时系统会自动给类添加ivar,添加的ivar以一个下划线“_”做前缀。

(2)避免莫名其妙的Bug

    在这里简单说一下_object和object的区别。_object是MyClass类的成员变量,object是属性。property和synthesize定义了一对getter和setter方法,在这里的getter方法是object,setter方法是setObject,事实上getter和setter方法操作的是变量_object。

    如果写synthesize objec = _object 时getter方法为:

[plain]  view plain copy
  1. -(MyObject *)object  
  2. {  
  3.     return _object;  
  4. }  
    如果写synthesize object 时getter方法为:

[plain]  view plain copy
  1. -(MyObject *)object  
  2. {  
  3.     return object;  
  4. }  
    当函数名和属性名重名的时候会出现意想不到的错误,为了避免这种Bug,Apple给的Demo Code里面多数也采用这种方式。

(3)属性和变量的用法

    属性是用self.object,通过getter方法来调用的,可以在类外使用。而变量是通过_object来调用,只能在该类对应的implementation中使用,在类外不能使用。

    下面看一下两种赋值操作:

   

[plain]  view plain copy
  1. self.object = [[MyObject alloc] init];  
  2. object = [[MyObject alloc] init];  
    第一种的方式和@property(nonamtic,retain)有关,实际上是通过调用setter方法setObject来实现赋值的。第二种方式是简单的指针赋值,没有调用setter方法。

    下面是retainCount的变化:

[plain]  view plain copy
  1. MyObject *tmp = [[MyObject alloc] init];  
  2. self.object = tmp;  //retainCount = 2  
  3. [tmp release];  //retainCount = 1  
  4. _object = [[MyObject alloc] init];  //retainCount = 1  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值