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方法
copy的setter方法
retain: 保留了赋值时传递的对象。在进行新的赋值之前释放了以前的值。
copy:发送一条复制的消息给被传递的对象保留它,并释放任何以前的值。
那这俩句话究竟是什么意思?看一段代码
既然存在了深拷贝,那么当然也存在浅拷贝。而copy也就是我们所说的浅拷贝,也就是内容的拷贝。copy是创建一个新对象,与原对象内容相同,与引用计数无关。旧的对象也没有变化。
如果没有理解上述的说法那么我们就记住:
当用基本数据类型的时候例如:int,double等 我们就把属性设置为assign
当用NSString时把属性设置为Copy
剩下的我们就把属性设置为strong(strong可以理解为retain的加强版)
属性的好处
属性声明为访问器方法提供了清晰,现实的配置。(访问器也就是getter,setter方法个人理解)
编译器可以按照你在声明中的配置为你合成访问器方法。
属性语法标示符,加上作用于限制,因此,编译器可以检测到未声明的属性的使用
@synthesize MyTestObject;
在没有arc以前我们常常会看到代码中有上述的字样那么这究竟是干什么的?
但是rac出现以后我们大可以不比这么麻烦。我们只需要这样
在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提高了内存管理的效率。
相关文章推荐
- IOS开发-小白进阶-什么是ARC(一)
- iOS应用开发:什么是ARC
- ios开发之深入浅出 (1) — ARC是什么
- iOS应用开发:什么是ARC?
- iOS应用开发:什么是ARC?
- ios 开发中什么是ARC
- iOS应用开发:什么是ARC?
- IOS开发-小白进阶-通知中心
- iOS应用开发:什么是ARC?
- iOS应用开发:什么是ARC?
- iOS应用开发:什么是ARC
- iOS开发-小白进阶-iOS中的类
- iOS应用开发:什么是ARC?
- iOS应用开发:什么是ARC?
- iOS应用开发:什么是ARC?
- iOS应用开发:什么是ARC?
- iOS应用开发:什么是ARC?
- 小白学习iOS开发都需要有什么基础
- iOS应用开发:什么是ARC?
- iOS应用开发:什么是ARC?