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做性能优化和性能检测,趁着这个机会深入研 ...
随机推荐
- C#模拟百度登录并到指定网站评论回帖(四)
基本的实现功能前面已经全部讲完,基本上可以复制黏贴完成登录百度的过程了 今天的这一贴就说说怎么获取百度的验证码 内容回顾:还记得前面第一贴说的如果登录发生异常,百度会发回2个值吗?是的,就是codeT ...
- oracle 用sql语句管理数据库
基础sql语句 创建数据库 :create database database_name; 创建表:create table(字段名 字段类型 字段为空约束 ,字段名 字段类型 字段为空约束,,,, ...
- Angular——路由参数
基本介绍 在控制中注入$routeParams可以获取传递的参数 区别对比 angular中的路由是指#之后的内容,包括之后的?,而在之前的http地址中我们习惯性的将?放在前面 具体使用 1.形参 ...
- 使用python获得N个区分度较高的RGB颜色值
获得任意N个区分度最高的RGB颜色值是一个经典的问题,之前在做一些可视化的东西时需要解决这个问题.首先去网上找了一些方法,未果,于是想自己来搞,心里的想法是,先给出一个距离函数用来度量两个RGB颜色值 ...
- js延时加载的方法
js的延迟加载有助与提高页面的加载速度,以下是延迟加载的几种方法: 1.使用setTimeout延迟方法的加载时间 延迟加载js代码,给网页加载留出更多时间 <script type=" ...
- JS中的let和var的区别
最近很多前端的朋友去面试被问到let和var的区别,其实阮一峰老师的ES6中已经很详细介绍了let的用法和var的区别.我简单总结一下,以便各位以后面试中使用. ES6 新增了let命令,用来声明局部 ...
- 关于mybatis返回值resultType为空的问题
假设数据库中一个user表 此时只有id为1的数据,当我们查询id为2的年龄时的时候返回值为null 但是在mybatis中预定义UserMapper.xml中 <select id=" ...
- 打造完美的ImageLoader——LruCache+DiskLruCache
做android应用少不了要和网络打交道,在我刚开始学android的时候总是处理不好网络图片的加载,尤其是图片乱跳的问题,后来发现了各种缓存图片的方法:本地缓存.软引用.LruCache.... 我 ...
- [Algorithm] 9. Two Sum
Description Given an array of integers, return indices of the two numbers such that they add up to a ...
- 【06】AngularJS 控制器
AngularJS 控制器 AngularJS 控制器 控制 AngularJS 应用程序的数据. AngularJS 控制器是常规的 JavaScript 对象. AngularJS 控制器 Ang ...