大钟的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开发的人来说,真是极好的,不用操心内存的管理,也不用担心内存泄露。


三、开启ARC的支持  


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是指针拷贝。


 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。