ios高效开发二--ARC跟block那点事_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > ios高效开发二--ARC跟block那点事

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

 2013/7/31 11:08:41  星烨痕  博客园  我要评论(0)
  • 摘要:block是可以捕捉上下文的特殊代码块。block可以访问定义在block外的变量,当在block中使用时,它就会为其在作用域内的每个标量变量创建一个副本。如果通过self拥有一个block,然后又在block中改变了实例变量,就会出错。例如:1self.block=^(NSString*aString)2{3self.aLabel.text=aString;4});这段代码中,self保留了block,同时block又保留了self,会引发循环保留。很危险。如果未使用ARC
  • 标签:iOS 开发
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 5
10 // __unsafe_unretained id safeSelf = self; //ios 4
11 self.block = ^(NSString *aString)
12 {
13     safeSelf.aLabel.text = aString;
14 });
  在arc出现之前,我们可以自由的把CF*对象转成NS*对象,这称为自己桥接。用了arc之后,我们需要指定一个所有权转移修饰符。 目前arc中提供的修饰符有: 1.__bridge 2.__bridge_retained 3.__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

 

上一篇: FAMP2.0一键搭建Apache+MYSQL数据库+PHP+GD库+PHPmyadmin 下一篇: 没有下一篇了!
发表评论
用户名: 匿名