iOS __block,__weak,__strong 的理解
__block
在 block 里面可以访问局部变量,但是不能修改局部变量,这是因为当局部变量在 block 中使用时,实际上是使用的变量在 block 中复制的数据,所以在 block 中修改的变量并不能修改 block 外面的变量值。这里要注意的是可变数组或者字典在 block 中添加或删除数据的时候,并不用 _block 修饰,因为在 block 里面使用这些数组的时候,数组的指针并没有发生变化,仅仅是内存的内容发生了变化
__weak
在 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 的情况:
-
系统的大部分 GCD 方法
这里是因为,block 作为参数传递给 GCD 时,系统会将 block 拷贝到堆上,而且 block 会持有 block 中用到的对象,并不是 self 持有,为了确保系统执行 block 中的任务时,其对象没有被意外释放掉,GCD 必须自己 strong 一次自己的对象,任务完成后在 release 掉,如果这里使用了 __weak 那么 GCD 就不会增加对象的引用计数,这样就造成在 block 访问起对象时,对象有可能已经被释放掉了
-
大部分的 UIView 动画
这里是因为 block 本身并不是被 self 持有,而是被 UIView 持有,并不会产生循环引用,当动画结束时,UIView 会释放掉 block ,block 会释放它持有的 self
__strong
在有些情况下,block 里面的 self 会被多次引用,这时候如果第一次引用后,因为时弱引用的状态,又可能 self 就会被释放掉,为了防止这种情况出现,就需要在 block 中先用 __strong 修饰一下 self
即:如果在 block 中单次访问 self 或者 变量,只在外部使用一次 __weak 修饰 self 或者变量即可,如果要在 block 中多次访问 self 或者变量,则不仅要在外部用 __weak 修饰,在内部也要用 __strong 修饰一次。如果涉及到要修改变量,则要在外部用 __block 修饰 (ARC)
这里是一些对于 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。