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

1、属性

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

《The Objective-c Programming Language》

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

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

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

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

  1. @interface MyClass:NSObject{  
  2. MyObjecct *_object;
  3. }
  4. @property(nonamtic, retain) MyObjecct *object;
  5. @end
  6. @implementatin MyClass
  7. @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方法为:

  1. -(MyObject *)object
  2. {
  3. return _object;
  4. }

如果写synthesize object 时getter方法为:

  1. -(MyObject *)object
  2. {
  3. return object;
  4. }

当函数名和属性名重名的时候会出现意想不到的错误,为了避免这种Bug,Apple给的Demo Code里面多数也采用这种方式。

(3)属性和变量的用法

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

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

  1. self.object = [[MyObject alloc] init];
  2. object = [[MyObject alloc] init];

第一种的方式和@property(nonamtic,retain)有关,实际上是通过调用setter方法setObject来实现赋值的。第二种方式是简单的指针赋值,没有调用setter方法。

下面是retainCount的变化:

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

最新文章

  1. eclipse启动优化,终于不那么卡了!
  2. 哈哈:sqlserver2008附加数据库时操作系统错误5(拒绝访问)错误5012的解决办法
  3. IOS 学习资料
  4. C#类的一些概念
  5. Hibernate的dialect大全
  6. (一)在linux上ubuntu搭建hustOJ系统
  7. To Miss Our Children Time(dp)
  8. USB的VID和PID,以及分类(Class,SubClass,Protocol)
  9. CodeForces 670C Cinema
  10. 修改VirtualBox虚拟机默认存储路径及虚拟机迁移方法
  11. HAproxy负载均衡
  12. CUDA版本的OpenCL在windows 7的下编程初步
  13. Asp.net core 学习笔记 Razor Page
  14. 使用VSTS的Git进行版本控制(三)——评审历史记录
  15. IT人如何打造个性化的个人网站(在线简历)
  16. 2018.06.27 POJ3281 Dining(最大流)
  17. istio1.0.2配置
  18. CentOS 7中firewall防火墙详解和配置以及切换为iptables防火墙
  19. CSS快速入门-鼠标悬浮(hover伪类)
  20. Ubuntu下用devstack单节点部署Openstack

热门文章

  1. 编译libmemcached
  2. Outlook 配置qq邮箱账号
  3. jQuery实际案例③——手风琴的效果
  4. 利用python3.x实现小爬虫下载贴吧内图片
  5. Python读取指定文件夹(包括当前目录、子目录、子文件)
  6. Wannafly挑战赛14E无效位置
  7. torch7 调用caffe model 作为pretrain
  8. 到底啥是平台,到底啥是中台?李鬼太多,不得不说(ZT)
  9. ts结合vue使用的感悟
  10. C# 中移动文件到指定位置