IOS开发之block应用
非常长时间都是在学习各位大神的力作,并汲取了不少养料,在此一并谢过各位大神了。
当然了。好东西是要跟大家一起分享的,近期发现了几个很不错的个人网站,都是介绍IOS开发的。当中有唐巧、破船之长、池建强、王维等各位,当中不乏供职于腾讯和阿里这种IT巨头。希望大家也能从他们的博客中学习到一些技术之外的东西。
就不再啰嗦啦,附上地址:http://www.ityran.com/archives/4647
这几天在学习IOS7 CookBook。由于没有找到中文版。就硬着头皮啃原著吧。还真学到了不少东西,非常值得跟大家分享,今天先把block里边关于变量引用的部分写一下吧,都是自己的读书感悟。如有错误,恳请各位高人不吝赐教。
首先,block在我们平时编程过程中,使用的不多。起码我基本不用的\(^o^)/~
但在GCD多线程里。基本全是block的身影,所以多了解一下。在处理IOS7的多任务时,还是蛮有优点的。
1.声明方法
block的声明方法:返回值类型(^方法名)(变量类型,变量类型)(參数)
比如://返回值为字符串类型,带有一个整形变量的名称为intToString的blcok
NSString *(^intToString)(NSUInteger)=^(NSUInteger parma)
{
NSString *result=[NSString stringWithFormat:@"%lu",(unsigned long) parma];
return result;
};
使用过程中,这样调用就能够了:
NSString *result=intToString(10000);
NSLog(@"result:%@",result);
2.关于变量的调用
在IOS程序中。大致有三种变量,全局变量、block之外的局部变量和block内声明的局部变量。
block对在block内生命的变量是有绝对的read write权限的,可是对于全局变量和在block之外的局部变量就没有那么大的权限了。
对于全局变量而言。若要进行读写,仅仅有调用get set方法了
对于在block外部声明的局部变量,block是有读权限的。若要添加write权限,须要在变量前加入__block前缀。
代码的力量总是无穷无尽的,以下就来看一下详细是怎么实现的吧
- (void)simpleMethod
{
//若要在block内对外部声明的变量进行write操作,要加上__block前缀
//否则仅仅有read权限
__block NSUInteger outsideVariable=10; NSMutableArray *array=[[NSMutableArray alloc]initWithObjects:@"obj1",@"obj2", nil];
[array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
//对于block内声明的变量而已,具有read write权限
NSUInteger insideVarible=20;
outsideVariable=50;
NSLog(@"outSide variable=%lu",(unsigned long)outsideVariable); NSLog(@"inside variable=%lu",(unsigned long)insideVarible); //调用self
NSLog(@"self:%@",self); //使用.属性 需使用set get方法
self.stringParoperty=@"helloWorld";
NSLog(@"self.stringProperty:%@",self.stringParoperty); return NSOrderedSame;
}]; }
3.关于self的使用
在独立的block函数内。是不能直接调用self的,仅仅有通过參数传递的方式才干对self进行訪问
//不能在独立的block内使用self。必须以參数形式传递
//使用.属性时。须要set get方法进行读写设置
void (^incorrectBlockObject)(id)=^(id selfParam)
{
NSLog(@"self:%@",selfParam); [selfParam setStringParoperty:@"Block Object"];
NSLog(@"self.stringProperty:%@",[selfParam stringParoperty]);
};
4.block对会copy传递过来的參数,并不会随着所传递參数的值的改变,而改变原来的參数值,详细例如以下:
- (void)scopeTest
{
NSUInteger integerValue=10;
BlockWithNoparam myBlock=^{
NSLog(@"Integer value inside the block:%lu",(unsigned long)integerValue);
}; integerValue=20;
myBlock(); NSLog(@"Integer value inside the block:%lu",(unsigned long)integerValue);
}
在控制台,你会发现,输出的值是10和20 ,却不是改变变量后的20 和20.
要改变这一现象,跟前面提到过的一样,仅仅要在integerValue前加入__block 前缀就可以。刚兴趣的朋友能够试一下哦\(^o^)/~
关于这一部分的測试代码,我会放在下载频道,有须要的同学,能够直接下载。
http://download.csdn.net/detail/jidiao/7283035
IOS开发之block应用的更多相关文章
- iOS 开发之Block
iOS 开发之Block 一:什么是Block.Block的作用 UI开发和网络常见功能的实现回调,按钮事件的处理方法是回调方法. 1. 按钮事件 target action 机制. 它是将一 ...
- 李洪强iOS开发之Block和协议
李洪强iOS开发之Block和协议 OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任 ...
- iOS开发之Block
1.定义 (1) Block是OC中的一种数据类型,在iOS开发中被广泛使用 (2) ^是Block的特有标记 (3) Block的实现代码包含在{}之间 (4) 大多情况下,以内联inline函数的 ...
- ios开发之block的使用,及注意事项
转自:http://my.oschina.net/u/1432769/blog/390401 Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事.需要注意的是由于 ...
- iOS开发之block解析
1. block的本质是一个Objective-C的对象,为什么这么说? 在Objective-C中,runtime会在执行时依据对象的isa指针的指向,来度额定这个对象的类型,也能够觉得一个对象,它 ...
- iOS 开发之 GCD 不同场景使用
header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em} .markdown-body{overflow:hidden} .markdo ...
- iOS 开发之 GCD 基础
header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em} .markdown-body{overflow:hidden} .markdo ...
- iOS开发之MVVM在项目中的应用
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 李洪强iOS开发之RunLoop的原理和核心机制
李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...
随机推荐
- 2017-12-04HTML布局_div布局
HTML布局_div布局 <!doctpye> <html> <head> <meta charset = 'utf-8'> <title> ...
- 关于defineProperty
var c=0; Object.defineProperty(this,'b',{ get :function(){ return ++c; } }) console.log(b===1&&a ...
- python自动化--语言基础二运算符、格式化输出、条件语句、循环语句、列表、元组
运算符包括:算术运算符.比较运算符.赋值运算符.逻辑运算符.成员运算符.身份运算符. 算术运算符 % 取模(余数) // 取相除的整数部分 / (5/2=2.5) 比较运算符 == 等于 ...
- SQLiteOpenHelper学习
0.视频:http://www.imooc.com/video/3384 1.SQLiteOpenHelper笔记: 2.SQLiteOpenHelper.java代码: import android ...
- table的数据行tr上下移动
昨天帮别人解决一个前端页面表格里的数据行上下移动的前端效果,直奔google找了几个demo,发现demo是实现了效果,但是代码很多,最后还是决定自己用jquery写个吧, 首先将前端效果分析出编程逻 ...
- SDK_按键消息的拦截
按键消息的拦截 拦截是为了在原有功能的基础上增加自己的操作 扩展:当按钮接收到点击消息的时候,响应的是WM_LBUTTONDOWN消息,按钮的会被这个消息打包成一个WM_COMMAND 消息发送给父窗 ...
- 12C语言标准函数库
C语言标准函数库 数学函数 三角函数 指数和对数函数 双曲线函数 其它函数 Sqrt() Pow() Exp() Log() Sin() Cos() Tan() 时间函数 查找和排序 Bsearch( ...
- 【Redis】三、Redis安装及简单示例
(四)Redis安装及使用 Redis的安装比较简单,仍然和大多数的Apache开源软件一样,只需要下载,解压,配置环境变量即可.具体安装过程参考:菜鸟教程Redis安装. 安装完成后,通过r ...
- Java基础——异常
一.什么是异常 异常的英文单词是exception,字面翻译就是“意外.例外”的意思,也就是非正常情况.事实上,异常本质上是程序上的错误,包括程序逻辑错误和系统错误.比如使用空的引用.数组下标越界. ...
- 洛谷——P2094 运输
P2094 运输 题目描述 现在已知N件商品,和搬运它们其中每一件的费用.现在搬家公司老板Mr.sb决定让我们每次任意选取2件商品.然后这2件商品只算一件商品的费用.但是这个商品的搬运费用是将选出的2 ...