block是可以捕捉上下文的特殊代码块。
block可以访问定义在block外的变量,当在block中使用时,它就会为其在作用域内的每个标量变量创建一个副本。
如果通过self拥有一个block,然后又在block中改变了实例变量,就会出错。
例如:
 self.block = ^(NSString *aString)
{
self.aLabel.text = aString;
});
这段代码中,self保留了block,同时block又保留了self,会引发循环保留。很危险。
如果未使用ARC,可以使用__block和__unsafe_unretained来复制一个未保留的引用副本。
 //例如:(无ARC)
__block id safeSelf = self;
self.block = ^(NSString *aString)
{
safeSelf.aLabel.text = aString;
}); //(有ARC)
__weak id safeSelf = self; //ios 5
// __unsafe_unretained id safeSelf = self; //ios 4
self.block = ^(NSString *aString)
{
safeSelf.aLabel.text = aString;
});
 
在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

ios高效开发二--ARC跟block那点事的更多相关文章

  1. ios高效开发--blocks相关

    1.替换delegate       如果我们有2个viewController,a和b,当我们从a界面push到b后,在b上面触发了一些事件,这些时间又会影响到a界面上的内容.            ...

  2. ios高效开发-正确的使用枚举(Enum)

    前言 Enum,也就是枚举,从C语言开始就有了,C++.Java.Objective-C.Swift这些语言,当然都有对应的枚举类型,功能可能有多有少,但是最核心的还是一个—规范的定义代码中的状态.选 ...

  3. iOS高效开发必备的10款Objective-C类库

    http://blog.csdn.net/yhawaii/article/details/7392988

  4. IOS基础开发二(iphone计算器)

    今天做了个iphone的小例子计算器:才用mvc设计模式 项目目录: 代码如下: CalculatorViewController:(MVC的控制器) // CalculatorViewControl ...

  5. iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)

    手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...

  6. iOS开发 - OC - block的详解 - 深入篇

    深入理解oc中的block 苹果在Mac OS X10.6 和iOS 4之后引入了block语法.这一举动对于许多OC使用者的编码风格改变很大.就我本人而言,感觉block用起来还是很爽的,但一直以来 ...

  7. iOS开发-二维码扫描和应用跳转

    iOS开发-二维码扫描和应用跳转   序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如Z ...

  8. iOS应用开发:什么是ARC?

    iOS应用开发:什么是ARC? 博客分类: Phone / IOS / Objective-C / Swift   ARC是什么 ARC是iOS 5推出的新功能,全称叫 ARC(Automatic R ...

  9. iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2)

    iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2) 此时,当用户轻拍按钮后,一个叫tapButton()的方法就会被触发. 注意:以上这一种方式是动作声明和关联一起进行的,还有一种先 ...

随机推荐

  1. 运行npm run watch时报:events.js:182 throw er; // Unhandled 'error' event

    I had this issue i did the following steps and i have no issues anymore: Delete node_modules directo ...

  2. java.lang.Object 方法解析

    1.clone() a.是一个native方法,效率比非native高 b.是protected 修饰的,要用他必须继承object,默认都是继承object的 c.返回是一个object 对象,需要 ...

  3. Maven使用package打包Spring Boot时出现:Unable to find a single main class from the following candidates的问题解决

    问题如下: [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.3.5.RELEASE ...

  4. POJ 2831

    次小生成树.求出两点间最短路径的最大权值,再把要加入的边与之比较即可. #include <iostream> #include <cstdio> #include <c ...

  5. 数据结构之---C++语言实现图的十字链表存储表示

    近期一直忙着考研复习,非常久都没有更新博客了.今天写一篇数据结构的存储. //有向图的十字链表存储表示 //杨鑫 #include <iostream> #include <cstd ...

  6. notifyDataSetChanged()刷新ListView(使用JSONArray绑定的Adapter)

    1.fragment代码: package com.ts.fragment; import java.util.ArrayList; import java.util.HashMap; import ...

  7. [HTML5] 新标签解释及用法

    转自:http://www.cnblogs.com/yuzhongwusan/archive/2011/11/17/2252208.html HTML 5 是一个新的网络标准,目标在于取代现有的 HT ...

  8. BZOJ-3732 Network 图论 最小生成树 倍增

    题面 题意:给你N个点,M条边的无向图 (N<=15000,M<=30000)第j条边的长度为 dj (1<=dj<=1e9),然后K个询问 (1<=K<=2000 ...

  9. Python基础教程思维导图笔记

    说明:直接查看图片可能不太清楚,用浏览器打开后,按住 Ctrl ,网上滚动鼠标放大浏览器页面,可以看清楚图片

  10. guice基本使用,guice整合guice-servlet,web scope注解(六)

    guice servlet提供了几个比较有用的web scope,类似与传统servlet 的session,request这些提供的范围等. guice servlet 提供的web scope 如 ...