ios高效开发二--ARC跟block那点事

block是能够捕捉上下文的特殊代码块。block能够访问定义在block外的变量,当在block中使用时,它就会为其在做用域内的每一个标量变量建立一个副本。若是经过self拥有一个block,而后又在block中改变了实例变量,就会出错。例如:
1 self.block = ^(NSString *aString)2{3 self.aLabel.text = aString;4 });


这段代码中,self保留了block,同时block又保留了self,会引起循环保留。很危险。若是未使用ARC,能够使用__block和__unsafe_unretained来复制一个未保留的引用副本。
 1//例如:(无ARC) 2 __block id safeSelf = self; 3 self.block = ^(NSString *aString) 4{ 5 safeSelf.aLabel.text = aString; 6}); 7 8//(有ARC) 9 __weak id safeSelf = self; //ios 510// __unsafe_unretained id safeSelf = self; //ios 411 self.block = ^(NSString *aString)12{13 safeSelf.aLabel.text = aString;14 });
在arc出现以前,咱们能够自由的把CF*对象转成NS*对象,这称为本身桥接。用了arc以后,咱们须要指定一个全部权转移修饰符。目前arc中提供的修饰符有:1.__bridge2.__bridge_retained3.__bridge_transfer 第一个修饰符__bridge是一个普通的转换,表示不须要增长引用计数,不更改全部权。第二个是在转换C指针类型时,增长引用计数的值。第三个是把Core Foundation 指针类型转换成obj-c指针,变把引用计数值+1。如用Core Foundation 方法建立一个对象,而且要用arc来管理对象的内存,就能够用这个。 arc移植的常见错误1.强制转换obj-c指针位C指针(或者反过来转换)2.在arc中把void*指针强制转成id类型(或者反过来转),若是要转,就必须是用修饰符例如: id selfPointer = (__bridge void *)self;3.在结构体或者(union)集合体中是用obj-c对象4.使用NSAutoreleasePool
相关文章
相关标签/搜索