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 的情况:

  1. 系统的大部分 GCD 方法

    这里是因为,block 作为参数传递给 GCD 时,系统会将 block 拷贝到堆上,而且 block 会持有 block 中用到的对象,并不是 self 持有,为了确保系统执行 block 中的任务时,其对象没有被意外释放掉,GCD 必须自己 strong 一次自己的对象,任务完成后在 release 掉,如果这里使用了 __weak 那么 GCD 就不会增加对象的引用计数,这样就造成在 block 访问起对象时,对象有可能已经被释放掉了


  2. 大部分的 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。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容