在 block 里面可以访问局部变量,但是不能修改局部变量,这是因为当局部变量在 block 中使用时,实际上是使用的变量在 block 中复制的数据,所以在 block 中修改的变量并不能修改 block 外面的变量值。这里要注意的是可变数组或者字典在 block 中添加或删除数据的时候,并不用 _block 修饰,因为在 block 里面使用这些数组的时候,数组的指针并没有发生变化,仅仅是内存的内容发生了变化
在 block 中,block 会对其对象强引用,对于 self 也会形成强引用,而 self 本身对于 block 也是强引用的,这样就会造成循环引用,这时候就需要用 __weak 打破这种循环,使对象弱引用。或者在 block 执行完后,将 block 置为 nil 也可以打破循环引用,但是这样做的话,block 只会执行一次,要是再次使用的话,就要重新赋值
使用 __weak 打破循环的方法只在 ARC 下才有效,早 MRC 下应该使用 __block
关于 _block 在 MRC 和 ARC 模式下的区别
- _block 在 MRC 下有两个作用
1,允许在 block 内访问和修改局部变量
2,禁止 block 对所引用的对象进行隐式 strong 操作- _block 在 ARC 下的作用
1,允许在 block 内访问和修改局部变量
下面是一些在 block 里面不需要使用 __weak 的情况:
在有些情况下,block 里面的 self 会被多次引用,这时候如果第一次引用后,因为时弱引用的状态,又可能 self 就会被释放掉,为了防止这种情况出现,就需要在 block 中先用 __strong 修饰一下 self
这里是一些对于 tepyfo 内容的解释
typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型。 它返回值是一个字符串,该字符串说明运算数的类型。
一、对于数字类型的操作数而言, typeof 返回的值是 number。比如说:typeof(1),返回的值就是 number。 上面是举的常规数字,对于非常规的数字类型而言,其结果返回的也是 number。比如 typeof(NaN),NaN 在 JavaScript 中代表的是特殊非数字值,虽然它本身是一个数字类型。
二、对于字符串类型, typeof 返回的值是 string。比如 typeof("123") 返回的值是 string。
三、对于布尔类型, typeof 返回的值是 boolean. 比如 typeof(true) 返回的值是 boolean。
四、对于对象、数组、null 返回的值是 object 。比如 typeof(window),typeof(document),typeof(null) 返回的值都是 object。
五、对于函数类型,返回的值是 function。比如:typeof(eval),typeof(Date) 返回的值都是 function。
六、如果运算数是没有定义的(比如说不存在的变量、函数或者 undefined),将返回 undefined。比如:typeof(sss)、typeof(undefined) 都返回 undefined。
来源: http://www.jianshu.com/p/a42f9c1fa8f1