在使用Objective-C语言进行了一段时间的iOS开发以后,发现本身的语言基础相对薄弱,因而开始弥补本身的短处。我发如今用过一种语言以后,再回过头来看它的不少原理会发现有更加深入的理解。下面就对一直困惑个人属性和成员变量的用法和关系问题进行浅析,因为水平有限可能会有错误,请看过文章的人多多指正。html
一、属性编程
关于属性的用法在苹果的官方文档《The Objective-C Programming Language》中有详细的说明,在这里就再也不赘述,连接以下:app
《The Objective-c Programming Language》编程语言
若是你的英文很差,不要紧,已经有人把这个文档所有翻译完了,连接以下:函数
二、关于@synthesize object = _object 的解释spa
咱们在不少代码中会见到这样的写法:.net
[plain] view plaincopy翻译
@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方法为:
[plain] view plaincopy
-(MyObject *)object
{
return _object;
}
若是写synthesize object 时getter方法为:
[plain] view plaincopy
-(MyObject *)object
{
return object;
}
当函数名和属性名重名的时候会出现意想不到的错误,为了不这种Bug,Apple给的Demo Code里面多数也采用这种方式。
(3)属性和变量的用法
属性是用self.object,经过getter方法来调用的,能够在类外使用。而变量是经过_object来调用,只能在该类对应的implementation中使用,在类外不能使用。
下面看一下两种赋值操做:
[plain] view plaincopy
self.object = [[MyObject alloc] init];
object = [[MyObject alloc] init];
第一种的方式和@property(nonamtic,retain)有关,其实是经过调用setter方法setObject来实现赋值的。第二种方式是简单的指针赋值,没有调用setter方法。
下面是retainCount的变化:
[plain] view plaincopy
MyObject *tmp = [[MyObject alloc] init];
self.object = tmp; //retainCount = 2
[tmp release]; //retainCount = 1
_object = [[MyObject alloc] init]; //retainCount = 1