ios应用开发主要是开发什么,ios app用什么开发
IOS应用开发:ARC是什么?博客分类:
电话/IOS/Objective-C/Swift
什么是ARC
ARC是iOS 5推出的新功能,全称是ARC(自动引用计数)。简单来说,retain/release是自动添加到代码中的,需要手动添加来处理内存管理引用计数的代码可以由编译器自动完成。
该函数是在iOS 5/Mac OS X 10.7中导入的,Xcode4.2可以使用,简单理解ARC是指编译器(LLVM 3.0)在通过指定语法编译代码时,可以自动生成代码的引用计数管理部分。在某种程度上,ARC不是GC,而是一个静态分析器工具。
变异点
通过一小段代码,我们来看看使用ARC前后的变化点。
c代码
@ interfacenonacobject:ns object { ns string * name;}-(id)init with name:(ns string *)name;@ end @ implementationNonARCObject-(id)init with name:(ns string *)newName { self=[superinit];if(self){ name=[newname retain];} returnself}-(void)dealloc {[name release];【Superdealloc】;} @结束
c代码
@ interfaceARCObject:ns object { NSString * name;}-(id)init with name:(ns string *)name;@ end @ implementationARCObject-(id)init with name:(ns string *)newName { self=[super init];if(self){ name=newName;} returnself} @结束
当我们以前在Objective-C中使用内存管理规则时,我们通常采用以下准则
生成对象时,使用autorelease对象进行替换,然后在函数中retain对象返回时使用return[[object retain]auto release];用了ARC之后,我们就不需要这么做了,哪怕是最基础的发布。
使用ARC的好处
使用ARC有什么好处?
看到上面的例子,你就知道以后写Objective-C代码会容易很多,因为我们不需要担心烦人的内存管理,担心内存泄漏的代码总量减少了,看起来清爽了很多。还节省了人力,使代码高速化,降低了因为使用编译器管理引用计数而导致代码低效的可能性。
糟糕的地方
记住一堆新的ARC规则——关键词、特征等。需要一定的学习周期。有些旧代码被第三方代码使用起来比较麻烦;修改代码或修改编译开关需要花费时间。关于第二点,由于XCode4.2中默认ARC处于ON状态,所以在编译旧代码时经常会出现“自动引用计数问题”的错误信息。
此时,您可以将项目编译设置中的“对象ice-c自动引用计数”设置为否.如下图。
如果只是为了适应ARC某个。m文件,你只需添加-fno-objc-arc来编译这类文件的标志,如下所示。
ARC基本规则
Retain、release、auto-release、dealloc是编译器自动插入的,不能在代码中调用。虽然dealloc可以重载,但是不能叫【超级dealloc】。由于ARC不是GC,编译器需要一些规则来支持代码插入,所以在编写健壮的代码之前,您必须清楚这些规则。
目标-C对象
ObjectiveC中的对象有强指称和弱指称。当需要保留其他对象时,需要保留它们以确保对象引用计数增加1。只要对象的所有者存在,对象的强引用就一直存在。
对象处理的基本规则是
只要对象的持有者存在(对象被强引用),就可以使用该对象。持有者丢失后,该对象被丢弃。
强引用
(s1)firstName作为“natsu”string对象的原始持有者,是这个NSString类型的对象的强引用。
(s2)
在这里,名字被替换为aName,也就是说,aName也成为@ "natsu "字符串对象的持有者,aName也是该对象的强引用。
(s3)
在这里,更改名字的内容。生成一个新的字符串对象“maki”。此时,firstName成为“maki”的持有者,而@“纳志”的持有者只是aName。每个string对象都有自己的holder,所以它们都存在于内存中。
(s4)
追加新的变量otherName,它将成为@ "maki "对象的另一个持有者。即NSString类型对象的强引用。
(s5)
将otherName替换为aName,aName将成为@“Maki”字符串对象的持有者。而@“natsu”这个对象没有持有者,它将被丢弃。
弱引用
接下来,我们来看看弱引用的用法。
(w1)
与强引用一样,firstName作为字符串对象@“natsu”的持有者存在。即NSString类型的对象的强引用。
(w2)
使用关键字__weak声明弱引用weakName变量并替换firstName。此时weakName虽然指的是@“natsu”,但还是弱指。即weakName可以看到@“natsu”,但不是它的持有者。
(w3)
名字指向新对象@“Maki”并成为其持有者,而对象@“natsu”因为没有持有者而被放弃。同时,weakName变量将被自动替换为nil。
引用关键字
ARC中对象的引用主要包括以下关键字。用强、弱、自动释放限定的变量将隐式初始化为零。
__strong变量默认情况下用__strong关键字声明。如果变量中没有编写关键字,则默认为强引用。
_ _弱已经在上面看到了。这是一个弱引用的关键词。这个概念是一个新功能,是从iOS 5/Mac OS X 10.7导入的。因为这种类型不影响对象的生命周期,如果对象之前没有持有者,那么就会出现创建后就被丢弃的问题,比如下面的代码。
c代码
ns string _ _ weak * string=[[NSString galloc]initWithFormat:@ 名字:%@ ,[self first name]];NSLog(@ 字符串:%@ ,字符串);//此时字符串为空
如果操作系统版本部署目标设置为低于此版本,则当前部署目标不支持自动_ _编译时将报告弱引用。这时,我们可以使用下面的__unsafe_unretained。
弱引用的另一个特性是,当参数对象失去它的所有者时,变量会自动被付nil(归零)。
__unsafe_unretained这个关键字和__weak一样,也是一个弱引用。与__weak的区别仅在于是否执行零赋值(归零)。但是需要注意的是,变量指向的对象已经被放弃了,地址还在,但是内存中的对象没有了。如果您仍然访问该对象,您将得到一个“BAD_ACCESS”错误。
_ _ autoreleasing该关键字延迟对象的释放。例如,如果您想要将未初始化的对象引用传递给一个方法,并在该方法中实例化该对象,则在这种情况下可以使用_ _ autorelease。它经常被用来处理函数的有价值参数的返回,比如下面的例子。
c代码
-(void)generateerrorvariable:(_ _ autoreleasingNSError * *)param error {.* param error=[[NSErroralloc]initWithDomain:@ MyApp code:1 userinfo:error dictionary];}.{ NSError * error=nil[self generateerrorvariable:error];NSLog(@ 错误=%@ ,错误);}
再比如函数的返回值是在函数中申请的,所以当你想在调用端释放它的时候,往往会有下面的代码。
c代码
-(ns string *)string test { ns string * retStr=[NSStringstringWithString:@ test ];return[[retstr retain]auto release];}//使用arc-(ns string *)string test { _ _ autoreleasingnsstring * retstr=[nsstring aloc]initwithstring:@ test ];returnretStr}
也就是说,当方法的参数是id*并且您希望在方法返回时自动释放对象时,请使用此关键字。
摘要
今天,我们看到了基本的ARC使用规则。
您不能在代码中使用保留、释放、保留和自动释放。不能重载dealoc(如果是释放对象内存以外的进程,可以重载这个函数,但是不能调用[super dealoc])。不能使用NSAllocateObject。NSDeallocateObject不能在C结构中的对象指针id和void *之间使用if强制转换。它需要一个特定的方法(__bridge关键字),不能使用NSAutoReleasePool,但是@autoreleasepool块不能使用以“new”开头的属性名(如果使用,会出现如下编译错误“属性的合成getter遵循cocoa命名约定返回 owned 对象”)。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。