文档章节

在block中,整型变量、字符变量的运行结果和类成员的是不一样

孤芳自赏OS
 孤芳自赏OS
发布于 2015/01/15 21:09
字数 296
阅读 34
收藏 0
No.1 整型变量
int x = 10;
void (^vv)(void) = ^{printf("x is %d\n", x);};
x = 11;
vv();

运行结果:x is 10

No.2 字符变量
NSString* str = @"123";
void (^vv)(void) = ^(void){NSLog(@"str is %@", str);};
str = @"456";
vv();

运行结果:str is 123

No.3 类成员的整型变量
@interface Test : NSObject
{
   int x;
}
@property (nonatomic, assign) int x;
@end

@implementation Test
@end

Test* t = [[Test alloc] init];
t.x = 10;
void (^vv)(void) = ^(void){NSLog(@"t is %d", t.x);};
t.x = 20;
vv();

运行结果:t is 20

No.4 类成员的字符变量
- (void)logInfo
{
   self.name = @"123";
   void (^test)(void) = ^{NSLog(@"%@", self.name);};
   self.name = @"456";
   test();
}

Person* p = [[Person alloc] init];
p.name = @"1111";
void (^vv)(void) = ^(void){NSLog(@"t is %@\n", p.name);};
p.name = @"2222";
vv();

[p logInfo];

运行结果:t is 2222
         456
         
         
今日和前辈一起研究后发现:
block在捕获变量的时候只会保存变量被捕获时的状态(对象变量除外),
之后即便变量再次改变,block中的值也不会发生改变


同时,形如以下对常量的赋值在Xcode环境下
NSString* str = @"123";
NSLog(@"p1 = %p", str);
void (^vv)(void) = ^(void){NSLog(@"str is %@", str);};
str = @"456";
NSLog(@"p2 = %p", str);
vv();

p1和p2打印出指针的值是不一样的



© 著作权归作者所有

共有 人打赏支持
孤芳自赏OS
粉丝 7
博文 4
码字总数 1294
作品 0
南京
程序员
私信 提问
加载中

评论(5)

卧马扬沙
卧马扬沙
顶上
卧马扬沙
卧马扬沙
顶上
vsignsoft
vsignsoft
阿窦总结下呗
Gerry1218
Gerry1218
干的漂亮....
应该把__block的也列下运行结果...
vsignsoft
vsignsoft
79
iOS开发·必会的算法操作:字符串数组排序+模型对象数组排序

前面的话 为了给字符串数组排序,除了用C/C++的基本办法,iOS开发者更应该学会利用苹果专门为NSArray 排序提供的sortedArrayUsingComparator 方法: 其中,需要设置一个NSComparator 参数,它...

陈满iOS
2017/12/20
0
0
Java的常见误区与细节

1 在Java中,没有goto语句。因为大量使用goto语句会降低程序的可读性和可维护性,所以Java语言取消了goto的使用。同时,为了避免程序员自行使用goto所带来的混乱,Java语言仍将goto定义为一个...

余平的余_余平的平
2017/09/22
0
0
Java 常见的 30 个误区与细节!

1、在Java中,没有语句。因为大量使用语句会降低程序的可读性和可维护性,所以Java语言取消了的使用。同时,为了避免程序员自行使用所带来的混乱,Java语言仍将定义为一个关键字,但是没有定...

Java团长17
2018/07/11
0
0
2-Java基础语法-常量与变量

常量与变量 主要内容: 标识符 关键字 变量 数据类型 类型转换 常量 标识符 我们所认识的标识符: 类的名字,每一个字母是字符。 数字不能作为标识符的开头,标识符中间不能有空格。 标识符的命...

天涯明月笙
2018/07/30
0
0
python基础数据类型(二)

根据http://runoob.com自己整理输出内容。 Python中的变量不需要声明,每个变量在使用前都必须赋值,变量赋值以后该变量才回被创建。 标准库模块keyword.kwlist下包含了不可作为标识符的所有...

白羊IT
2017/10/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

第11章 多线程

程序、进程、线程 程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 **进程(process)**是程序的一次执行过程或是正在运行的一个程序。动...

流小文
35分钟前
3
0
SpringBoot引入第三方jar包或本地jar包的处理方式

在开发过程中有时会用到maven仓库里没有的jar包或者本地的jar包,这时没办法通过pom直接引入,那么该怎么解决呢 一般有两种方法 - 第一种是将本地jar包安装在本地maven库 - 第二种是将本地j...

独钓渔
今天
2
0
五、MyBatis缓存

一、MyBatis缓存介绍 缓存的使用可以明显的加快访问数据速度,提升程序处理性能,生活和工作中,使用缓存的地方很多。在开发过程中,从前端-->后端-->数据库等都涉及到缓存。MyBatis作为数据...

yangjianzhou
今天
2
0
最近研究如何加速UI界面开发,有点感觉了

最近在开发JFinal学院的JBolt开发平台,后端没啥说的,做各种极简使用的封装,开发者上手直接使用。 JBolt开发平台包含常用的用户、角色、权限、字典、全局配置、缓存、增删改查完整模块、电...

山东-小木
今天
3
0
《月亮与六便士》的读后感作文3000字

《月亮与六便士》的读后感作文3000字: 看完英国作家威廉.萨默塞特.毛姆所著《月亮与六便士》(李继宏译),第一疑问就是全书即没提到“月亮”,也没提到“六便士”。那这书名又与内容有什么...

原创小博客
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部