大钟的ios开发之旅(2)————简单说说ios中ARC与非ARC模式下的property的变量修饰词
/********************************************************************************************
* author:conowen@大钟
* E-mail:[email protected]
*site:http://www.idealpwr.com/
*深圳市动力思维科技发展有限公司
* http://blog.csdn.net/conowen
* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。
********************************************************************************************/
一、前言
ios开发中,@property的修饰就有很多的修饰词,如retain、assign、strong、weak、nonatomic等等,而这些修饰词在ARC模式下与非ARC模式下也是略有不同。下面先简单说说ARC模式
二、什么是ARC
ARC是iOS 5推出的新功能,全称为Automatic Reference Counting。一句话说,就是代码中自动加入了retain与release,原来需要手动去管理引用计数和手动释放计数的操作,编译器已经可以自动完成了。对于我这些从Android开发转到ios开发的人来说,真是极好的,不用操心内存的管理,也不用担心内存泄露。
1、使用xcode 6.1以上建立的工程,默认就是开启了ARC的支持
如图:
2、ARC与非ARC的混编
由于项目的需要,可能会使用一些非ARC的第三方库,通过以下设置,可以让项目同时兼容ARC与非ARC模式。
非ARC的话,代码后面加一个编译选项:-fno-objc-arc
ARC的话,代码后面加一个编译选项:-fobjc-arc
也可以把非ARC的代码转换为ARC类型的代码,其实就是把一些手动的retain与release代码去掉。
四、retain、assign、strong、weak、nonatomic的简单区别
1、ARC模式
一般来说ARC模式下的property变量修饰词为strong、weak,相当于非ARC模式下的retain、assign,
strong :代替retain。
weak:代替assign,但是比assign多一个功能,指针指向的地址被释放之后,指针本身也会自动被释放。
e.g.
XX.h
@property (strong,nonatomic)NSString *str1; @property (weak,nonatomic)NSString *str2;XX.m
@synthesize str1; @synthesize str2;
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. str1=[NSMutableString stringWithString:@"str1"]; NSLog(@"str1=%p",str1); str2=str1; str1=nil; NSLog(@"str2=%@",str2); NSLog(@"str2=%p",str2); }
log mesg:用了weak,自动释放指针,不会导致野指针。
2014-11-04 17:37:59.763 Helloworld[1184:426997] str1=0x15d6a420 2014-11-04 17:37:59.767 Helloworld[1184:426997] str2=(null) 2014-11-04 17:37:59.768 Helloworld[1184:426997] str2=0x0
若是做以下更改
XX.h
@property (strong,nonatomic)NSString *str1; @property (strong,nonatomic)NSString *str2;
log mesg:
2014-11-04 17:40:52.137 Helloworld[1191:427491] str1=0x14522b90 2014-11-04 17:40:52.139 Helloworld[1191:427491] str2=str1 2014-11-04 17:40:52.140 Helloworld[1191:427491] str2=0x14522b90
(野指针:指针指向的地址被释放,指针本身没有释放,这就是野指针)
2、非ARC模式
retain:当变量为指针类型的时候,需要retain修饰,使用setter方法(赋值)的时候,引用级数增加1。
assign:修饰非指针类型和id类型的变量,如NSInteger,CGFloat,或者delegate
3、通用模式
atomic:原子性,保证多线程安全。防止变量在写未完成的时候被另外一个线程读取,造成数据错误,但是会耗费一定的系统资源。
nonatomic:非原子性,禁止多线程,保护变量。没有使用多线程间的通讯编程,nonatomic可以提高系统性能。
copy:变量的内容拷贝,相对retain,retain是指针拷贝。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。