iOS中block 静态全局局部变量block变量,以及对象,详解!
//最近总是犯迷糊,关于block对外部变量的引用,今天有时间就写了一下,加深自己的理解,巩固基础知识 1 #import <Foundation/Foundation.h>
int gNum = ;
int main(int argc, const char * argv[]) {
@autoreleasepool {
static int sNum = ;
__block int bNum = ;
int lNum = ;
int (^sum)(int, int) = ^(int a, int b) {
NSLog(@"%d %d %d %d",sNum,gNum,lNum,bNum);
sNum++;
bNum++;
gNum++;
return a + b + lNum + gNum + sNum + bNum ;
};
sNum = ;
bNum = ;
gNum = ;
lNum = ; NSLog(@"%d",sum(,));
NSLog(@"%d",sNum);
NSLog(@"%d",bNum);
NSLog(@"%d",gNum);
NSLog(@"%d",lNum); }
return ;
}
打印结果
::09.984 xxx[:]
::09.984 xxx[:]
::09.984 xxx[:]
::09.984 xxx[:]
::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可以访问函数以外,词法作用域以内的外部变量的值。
二、对象类型
//本地对象
打印结果:
-- ::25.848 test1[:] localObj adress-- 0xbff7ced4 -- ::25.848 test1[:] localObj adress-- 0x7b63f8b4 -- ::25.848 test1[:] localObj --<UILabel: 0x7c8337a0; frame = ( ; );
//静态对象
- (void)staticObjTest
{
static UILabel *staticObj ;
staticObj = [[UILabel alloc]init];
NSLog(@"staticObj adress --%p", & staticObj);
void (^test)() = ^{
NSLog(@"staticObj adress --%p", & staticObj);
NSLog(@"staticObj --%@",staticObj);
};
staticObj = nil;
test();
}
打印结果:
--17 ::25.917 test1[:] staticObjadress -- 0x85a48 --17 ::25.917 test1[:] staticObjadress -- 0x85a48 --17 ::25.917 test1[:] staticObj --(null)
//全局对象
- (void)globalObjTest
{
globalObj = [[UILabel alloc]init];
NSLog(@"staticObj adress --%p", & globalObj);
void (^test)() = ^{
NSLog(@"globalObj adress --%p", & globalObj);
NSLog(@"globalObj --%@",globalObj);
};
globalObj = nil;
test();
}
-- ::25.917 test1[:] staticObjadress -- 0x85a4c -- ::25.917 test1[:] globalObjadress -- 0x85a4c -- ::25.917 test1[:] globalObj --(null)
//block对象
- (void)blockObjTest
{
__block UILabel *blockObj = [[UILabel alloc]init];
NSLog(@"blockObj adress --%p", & blockObj);
void (^test)() = ^{
NSLog(@"blockObj adress --%p", & blockObj);
NSLog(@"blockObj --%@",blockObj);
};
blockObj = nil;
test();
}
打印结果:
-- ::25.917 test1[:] blockObj adress-- 0xbff7ced0 -- ::25.918 test1[:] blockObj adress-- 0x7c835598 -- ::25.918 test1[:] blockObj --(null)
总结:从测试结果可以看到
*对于静态对象变量和全局对象变量,其地址同样不是固定的。
*对于局部(本地)对象变量,定义block的时候同样复制了(指针)变量,其在block中是作为(指针)常量使用的,不会受外界影响。
*对于block对象变量,定义block的时候同样将变量从栈转移到了堆上,这一点用刚才的方法同样可以验证。因此block变量是受外界影响的,导致输出结果为空。
iOS中block 静态全局局部变量block变量,以及对象,详解!的更多相关文章
- iOS中 扫描二维码/生成二维码详解 韩俊强的博客
最近大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang 新浪微博 指示根视图: se ...
- iOS中 视频直播功能-流媒体的使用(详解)韩俊强的CSDN博客
上一篇博客:(流媒体实现视频播放和下载功能):http://blog.csdn.net/qq_31810357/article/details/50574914 最近视频直播功能比较火,处于需求,研究 ...
- ios中创建可以拖动的view原理和实现详解
有时候我们会需要在界面上拖动view;uiview是继承于uiresponder的,所以可以响应触摸相关的事件. 重点是以下一组方法: - (void)touchesBegan:(NSSet *)to ...
- Node.js中环境变量process.env详解
Node.js中环境变量process.env详解process | Node.js API 文档http://nodejs.cn/api/process.html官方解释:process 对象是一个 ...
- Python中的变量和作用域详解
Python中的变量和作用域详解 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部 ...
- iOS回顾笔记(04) -- UIScrollView的基本使用详解
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- JS变量对象详解
JS变量对象详解 开年之后工作热情一直不是很高,这几天一直处于消极怠工状态.早上不想起床,起床了不想上班.明明放假之前工作热情还一直很高,一直心心念念的想把小程序项目怼出来,结果休假回来之后画风完全不 ...
- 深入MySQL用户自定义变量:使用详解及其使用场景案例
一.前言 在前段工作中,曾几次收到超级话题积分漏记的用户反馈.通过源码的阅读分析后,发现问题出在高并发分布式场景下的计数器上.计数器的值会影响用户当前行为所获得积分的大小.比如,当用户在某超级话题下连 ...
- JAVA JDK 环境变量配置 入门详解 - 精简归纳
JAVA JDK 环境变量配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 13 转载请注明出处!️ 目录 JAVA JDK 环境变量配置 入门详解 - 精简归纳 一.为什么j ...
随机推荐
- 判断浏览器环境(QQ,微信,安卓设备,IOS设备,PC微信环境,移动设备)
判断浏览器环境(QQ,微信,安卓设备,IOS设备,PC微信环境,移动设备) // ===== 判断浏览器环境 ===== // // 判断是否是QQ环境 function isQQ() { retur ...
- PHP实现消息推送
我们做web的时候偶尔会遇到消息推送,如图示例(红框位置) 当我们遇到这种功能要如何开发呢?下边将我了解的两种方法整理一下: 一.ajax轮询,定时去请求服务器数据 通过观察thinkphp官网貌似也 ...
- Flask初学者:Python虚拟环境,Flask安装,helloworld,run方法
一.Python虚拟环境: 作用:使Python框架的不同版本可以在同一台电脑上运行.如果在电脑上全局(C盘或者其他目录)安装Flask(或其他Python框架),当你使用其他版本的Flask(比如有 ...
- DFS:Tempter of the Bone (规定时间达到规定地点)
解题心得: 1.注意审题,此题是在规定的时间达到规定的地点,不能早到也不能晚到.并不是最简单的dfs 2.在规定时间达到规定的地点有几个剪枝: 一.公式:所需的步骤 - x相差行 - y相差列 = 偶 ...
- L1-049 天梯赛座位分配 (20 分)
天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位 ...
- (转)零基础入门深度学习(6) - 长短时记忆网络(LSTM)
无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就o ...
- 搭建Data Mining环境(Spark版本)
前言:工欲善其事,必先利其器.倘若不懂得构建一套大数据挖掘环境,何来谈Data Mining!何来领悟“Data Mining Engineer”中的工程二字!也仅仅是在做数据分析相关的事罢了!此文来 ...
- 自定义 popWindow弹框 工具包
前言:因为Android 没有像IOS一样的ActionSheet,虽然在github上看到有一些类似ActionSheet的库,总觉得不好用,不如自己写一个弹框通用类,样式全部自已来多好. Step ...
- day19 Dgango进阶 路由系统及 ORM 详解
完成一个完整的网页服务,需要有以下: 再次回顾一下Django 的完成开发流程: 一些值的获取: 对于性别,为互斥属性: 爱好则为多选: 需要使用新的方法 getlist 来获取多个爱好: 单选下拉框 ...
- R语言中文社区历史文章整理(类型篇)
R语言中文社区历史文章整理(类型篇) R包: R语言交互式绘制杭州市地图:leafletCN包简介 clickpaste包介绍 igraph包快速上手 jiebaR,从入门到喜欢 Catterpl ...