1. //最近总是犯迷糊,关于block对外部变量的引用,今天有时间就写了一下,加深自己的理解,巩固基础知识
  2.  
  3. 1 #import <Foundation/Foundation.h>
  4. int gNum = ;
  5. int main(int argc, const char * argv[]) {
  6. @autoreleasepool {
  7. static int sNum = ;
  8. __block int bNum = ;
  9. int lNum = ;
  10. int (^sum)(int, int) = ^(int a, int b) {
  11. NSLog(@"%d %d %d %d",sNum,gNum,lNum,bNum);
  12. sNum++;
  13. bNum++;
  14. gNum++;
  15. return a + b + lNum + gNum + sNum + bNum ;
  16. };
  17. sNum = ;
  18. bNum = ;
  19. gNum = ;
  20. lNum = ;
  21.  
  22. NSLog(@"%d",sum(,));
  23. NSLog(@"%d",sNum);
  24. NSLog(@"%d",bNum);
  25. NSLog(@"%d",gNum);
  26. NSLog(@"%d",lNum);
  27.  
  28. }
  29. return ;
  30. }
  31.  

打印结果

  1. ::09.984 xxx[:]
  2. ::09.984 xxx[:]
  3. ::09.984 xxx[:]
  4. ::09.984 xxx[:]
  5. ::09.984 xxx[:]

Block其实包含两个部分内容 
1.Block执行的代码,这是在编译的时候已经生成好的; 
2.一个包含Block执行时需要的所有变量值的数据结构。Block将使用到的,作用域附近的变量的值建立一份快照拷贝到栈上。 
Block与函数另一个不同是,Block类似Objc的对象,可以使用自动释放池管理内存 
3 Block对外部变量的存取管理 
基本数据类型 
1,局部变量 
局部自动变量,在Block中只读。Block定义时copy变量的值,在Block中作为常量使用,所以即使变量的值在Block外改变,也不影响他在Block中的值。 
2, static修饰符的静态变量或全局变量 
因为全局变量货静态变量在内存中的地址是固定的,Block在读取改变量值的时候是直接从其所在的内存读出的,获取daode 是最新值,而不是在定义时copy的常量。 
3,__block修饰的变量 
block变量,在被__block修饰的变量称作Block变量。基本类型的Block变量等小雨全局变量或静态变量。Block的使用很像函数指针,不过与函数最大的不同是:Block可以访问函数以外,词法作用域以内的外部变量的值。

二、对象类型

//本地对象

打印结果:

  1. -- ::25.848 test1[:] localObj adress-- 0xbff7ced4
  2.  
  3. -- ::25.848 test1[:] localObj adress-- 0x7b63f8b4
  4.  
  5. -- ::25.848 test1[:] localObj --<UILabel: 0x7c8337a0; frame = ( ; );
  1. //静态对象
  2. - (void)staticObjTest
  3. {
  4. static UILabel *staticObj ;
  5. staticObj = [[UILabel alloc]init];
  6. NSLog(@"staticObj adress --%p", & staticObj);
  7. void (^test)() = ^{
  8. NSLog(@"staticObj adress --%p", & staticObj);
  9. NSLog(@"staticObj --%@",staticObj);
  10. };
  11. staticObj = nil;
  12. test();
  13. }

打印结果:

  1. --17 ::25.917 test1[:] staticObjadress -- 0x85a48
  2.  
  3. --17 ::25.917 test1[:] staticObjadress -- 0x85a48
  4.  
  5. --17 ::25.917 test1[:] staticObj --(null)
  1. //全局对象
  2. - (void)globalObjTest
  3. {
  4. globalObj = [[UILabel alloc]init];
  5. NSLog(@"staticObj adress --%p", & globalObj);
  6. void (^test)() = ^{
  7. NSLog(@"globalObj adress --%p", & globalObj);
  8. NSLog(@"globalObj --%@",globalObj);
  9. };
  10. globalObj = nil;
  11. test();
  12. }
  1. -- ::25.917 test1[:] staticObjadress -- 0x85a4c
  2.  
  3. -- ::25.917 test1[:] globalObjadress -- 0x85a4c
  4.  
  5. -- ::25.917 test1[:] globalObj --(null)
  1. //block对象
  2. - (void)blockObjTest
  3. {
  4. __block UILabel *blockObj = [[UILabel alloc]init];
  5. NSLog(@"blockObj adress --%p", & blockObj);
  6. void (^test)() = ^{
  7. NSLog(@"blockObj adress --%p", & blockObj);
  8. NSLog(@"blockObj --%@",blockObj);
  9. };
  10. blockObj = nil;
  11. test();
  12. }

打印结果:

  1. -- ::25.917 test1[:] blockObj adress-- 0xbff7ced0
  2.  
  3. -- ::25.918 test1[:] blockObj adress-- 0x7c835598
  4.  
  5. -- ::25.918 test1[:] blockObj --(null)

总结:从测试结果可以看到

*对于静态对象变量和全局对象变量,其地址同样不是固定的。

*对于局部(本地)对象变量,定义block的时候同样复制了(指针)变量,其在block中是作为(指针)常量使用的,不会受外界影响。

*对于block对象变量,定义block的时候同样将变量从栈转移到了堆上,这一点用刚才的方法同样可以验证。因此block变量是受外界影响的,导致输出结果为空。

iOS中block 静态全局局部变量block变量,以及对象,详解!的更多相关文章

  1. iOS中 扫描二维码/生成二维码详解 韩俊强的博客

    最近大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 指示根视图: se ...

  2. iOS中 视频直播功能-流媒体的使用(详解)韩俊强的CSDN博客

    上一篇博客:(流媒体实现视频播放和下载功能):http://blog.csdn.net/qq_31810357/article/details/50574914 最近视频直播功能比较火,处于需求,研究 ...

  3. ios中创建可以拖动的view原理和实现详解

    有时候我们会需要在界面上拖动view;uiview是继承于uiresponder的,所以可以响应触摸相关的事件. 重点是以下一组方法: - (void)touchesBegan:(NSSet *)to ...

  4. Node.js中环境变量process.env详解

    Node.js中环境变量process.env详解process | Node.js API 文档http://nodejs.cn/api/process.html官方解释:process 对象是一个 ...

  5. Python中的变量和作用域详解

    Python中的变量和作用域详解 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部 ...

  6. iOS回顾笔记(04) -- UIScrollView的基本使用详解

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  7. JS变量对象详解

    JS变量对象详解 开年之后工作热情一直不是很高,这几天一直处于消极怠工状态.早上不想起床,起床了不想上班.明明放假之前工作热情还一直很高,一直心心念念的想把小程序项目怼出来,结果休假回来之后画风完全不 ...

  8. 深入MySQL用户自定义变量:使用详解及其使用场景案例

    一.前言 在前段工作中,曾几次收到超级话题积分漏记的用户反馈.通过源码的阅读分析后,发现问题出在高并发分布式场景下的计数器上.计数器的值会影响用户当前行为所获得积分的大小.比如,当用户在某超级话题下连 ...

  9. JAVA JDK 环境变量配置 入门详解 - 精简归纳

    JAVA JDK 环境变量配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 13 转载请注明出处!️ 目录 JAVA JDK 环境变量配置 入门详解 - 精简归纳 一.为什么j ...

随机推荐

  1. Date.prototype.Format---对Date的扩展

    // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占 ...

  2. Ajax基础知识梳理

    Ajax用一句话来说就是无须刷新页面即可从服务器取得数据.注意,虽然Ajax翻译过来叫异步JavaScript与XML,但是获得的数据不一定是XML数据,现在服务器端返回的都是JSON格式的文件. 完 ...

  3. HTML5页面元素中的文本最快速替换replace()方法

    $.ajax({ type:"get", url:spanUrl, dataType:'jsonp', jsonpCallback:'jsonp',//jsonp数据,需要数据库提 ...

  4. java util - base64转换工具

    测试代码 package cn.java.codec.base64; public class Test { public static void main(String[] args) { Stri ...

  5. 笔记1 python入门学习笔记

    目录 官方手册 菜鸟站手册地址: python的运行方法 注释 小技巧: input()接收用户输入的内容(默认为字符串) print() 运算符 is 是判断两个标识符是不是引用自一个对象 all和 ...

  6. Python中列表的深浅拷贝

    copy_lst = [ ('py对象三要素',), ('== 比较运算符',), ('is 身份运算符',), ('小数据池',), ('列表的浅拷贝',), ('列表的深拷贝',), ] py对象 ...

  7. 权限组件(11):基于formset实现批量增加

    效果图: 增加页面: 编辑页面: 因为后面要对权限进行批量操作,所以先用这个示例演示下如何实现批量操作 数据库 from django.db import models class Menu(mode ...

  8. POJ3436------ACM Computer Factory

    题目链接 ACM Computer Factory Description As you know, all the computers used for ACM contests must be i ...

  9. char* 与char[]区别

    [转] 最近的项目中有不少c的程序,在与项目新成员的交流中发现,普遍对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误.一时也不能说得很明白,网上也 ...

  10. billard:桌球的走位路线图解

    这些是桌球的一些基础知识,记得刚学会桌球那会儿很强烈的想找到类似图片或资料,好久都找不到,最严重的时候只要一闭上眼睛,满脑子就是桌球的路线,线路图几乎是无处不在,痛苦的是经常能理解过来的很多路线因为杆 ...