您的位置:首页 > 移动开发 > IOS开发

iOS开发-小白进阶-什么是ARC(二)

2015-01-08 19:39 375 查看
@property (nonatomic, strong) NSString *XXXArray;

在iOS程序中我们常常会看到上述的字样那么这究竟是什么意思呢?这也就是我们所说的属性。

属性

readewrite:指明属性是read/write 默认属性是readwrite。在没有arc以前需要@sythesize指令。这样getter,setter方法才会被生成。在arc以后我们不需要去使用@sythesize编译器会自动我们生成getter,setter方法。在下文会详细说明。

readonly:指明属性是只读的。只有getter方法被生成。假如使用self.XX来给只读属性赋值。那么编译器将会报错。

以上的属性属于可写性,是否与一个setter方法关联。

assign: 不复制不保留,直接赋值。

retain: 保留了赋值时传递的对象。在进行新的赋值之前释放了以前的值。

copy:发送一条复制的消息给被传递的对象保留它,并释放任何以前的值。

以上的三个属性属于setter语法

nonatomic:非原子性,不加同步,在多线程中会提高性能。

以上时原子性。

详细用法

@property (参数1, 参数2)  类型   变量名

参数1与参数2就是上面所提到的属性:可写性,setter方法,原子性。

可写性跟原子性没有什么要说的我们主要来看看setter方法中copy跟rentain。

retain的setter方法
-(void) steXXX :(ClassXXX *) obj{
if(_obj!= obj){
[_obj release];
_obj = [obj retain];
}
}



copy的setter方法
-(void) setXXX: (classXXX *) obj{
if(_obj != obj){
[_obj release];
_obj = [obj copy];
}
}



retain: 保留了赋值时传递的对象。在进行新的赋值之前释放了以前的值。

copy:发送一条复制的消息给被传递的对象保留它,并释放任何以前的值。

那这俩句话究竟是什么意思?看一段代码

MyTestObject * temp = [[MytestObject alloic] init];
self.obj = temp;//retaincount = 2
[temp release]; //reatainCount = 1;
_obj = [[MyTestObject alloc] init]; //retaincount = 1</span>
为什么会出现这种情况,实际上self.obj 条用的是setter方法来实现赋值的,而setter的属性正是retain。而_obj只是指针简单的赋值没有调用setter方法。简单的来说就是说retain我们可以理解为是指针的拷贝。retain是创建一个新指针,引用计数加一。它与原对象的地址相同的当然内容也是相同的。也就是C++中的深拷贝。

既然存在了深拷贝,那么当然也存在浅拷贝。而copy也就是我们所说的浅拷贝,也就是内容的拷贝。copy是创建一个新对象,与原对象内容相同,与引用计数无关。旧的对象也没有变化。

如果没有理解上述的说法那么我们就记住:

当用基本数据类型的时候例如:int,double等  我们就把属性设置为assign
当用NSString时把属性设置为Copy
剩下的我们就把属性设置为strong(strong可以理解为retain的加强版)
属性的好处
属性声明为访问器方法提供了清晰,现实的配置。(访问器也就是getter,setter方法个人理解)
编译器可以按照你在声明中的配置为你合成访问器方法。
属性语法标示符,加上作用于限制,因此,编译器可以检测到未声明的属性的使用

@synthesize MyTestObject;
在没有arc以前我们常常会看到代码中有上述的字样那么这究竟是干什么的?
@interface MyTestObject : NSObjecrt
@property (nonatomic, assign) int ntest;
@end

@implrmentation MyTestObject
@synthesize nTest;
@end
这段代码的意思就是要让nTest可以使用旧必须要用@synthesize提供一个跟属性名字相的及类型相同的实例变量来使用它。
但是rac出现以后我们大可以不比这么麻烦。我们只需要这样
@interface MyTestObject :NSObject
@property (nonatomic, assign) int nTest;
@end
编译器会自动生成getter,setter方法而arc的诞生,不仅省去了我门调用@synthesize实例化,而且还省去了人工release提高了内存管理的效率。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: