Objective-C的属性和成员变量用法及关系浅析
在使用Objective-C语言进行了一段时间的iOS开发之后,发现自己的语言基础相对薄弱,于是开始弥补自己的短处。我发现在用过一种语言之后,再回过头来看它的很多原理会发现有更加深刻的理解。下面就对一直困惑我的属性和成员变量的用法和关系问题进行浅析,由于水平有限可能会有错误,请看过文章的人多多指正。
1、属性
关于属性的用法在苹果的官方文档《The Objective-C Programming Language》中有详细的说明,在这里就不再赘述,链接如下:
《The Objective-c Programming Language》
如果你的英文不好,没关系,已经有人把这个文档全部翻译完了,链接如下:
2、关于@synthesize object = _object 的解释
我们在很多代码中会见到这样的写法:
- @interface MyClass:NSObject{
- MyObjecct *_object;
- }
- @property(nonamtic, retain) MyObjecct *object;
- @end
- @implementatin MyClass
- @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方法为:
- -(MyObject *)object
- {
- return _object;
- }
如果写synthesize object 时getter方法为:
- -(MyObject *)object
- {
- return object;
- }
当函数名和属性名重名的时候会出现意想不到的错误,为了避免这种Bug,Apple给的Demo Code里面多数也采用这种方式。
(3)属性和变量的用法
属性是用self.object,通过getter方法来调用的,可以在类外使用。而变量是通过_object来调用,只能在该类对应的implementation中使用,在类外不能使用。
下面看一下两种赋值操作:
- self.object = [[MyObject alloc] init];
- object = [[MyObject alloc] init];
第一种的方式和@property(nonamtic,retain)有关,实际上是通过调用setter方法setObject来实现赋值的。第二种方式是简单的指针赋值,没有调用setter方法。
下面是retainCount的变化:
- MyObject *tmp = [[MyObject alloc] init];
- self.object = tmp; //retainCount = 2
- [tmp release]; //retainCount = 1
- _object = [[MyObject alloc] init]; //retainCount = 1
最新文章
- eclipse启动优化,终于不那么卡了!
- 哈哈:sqlserver2008附加数据库时操作系统错误5(拒绝访问)错误5012的解决办法
- IOS 学习资料
- C#类的一些概念
- Hibernate的dialect大全
- (一)在linux上ubuntu搭建hustOJ系统
- To Miss Our Children Time(dp)
- USB的VID和PID,以及分类(Class,SubClass,Protocol)
- CodeForces 670C Cinema
- 修改VirtualBox虚拟机默认存储路径及虚拟机迁移方法
- HAproxy负载均衡
- CUDA版本的OpenCL在windows 7的下编程初步
- Asp.net core 学习笔记 Razor Page
- 使用VSTS的Git进行版本控制(三)——评审历史记录
- IT人如何打造个性化的个人网站(在线简历)
- 2018.06.27 POJ3281 Dining(最大流)
- istio1.0.2配置
- CentOS 7中firewall防火墙详解和配置以及切换为iptables防火墙
- CSS快速入门-鼠标悬浮(hover伪类)
- Ubuntu下用devstack单节点部署Openstack