ios开发 block语句块
ios开发 block语句块
1.block 理解为匿名函数
2.block变量的定义
//定义block变量,^表示定义block
//技巧:函数名左右加括号,在函数名前面在加^
void (^block)(); //定义block语句块,存储到了block变量中
block=^void ()
{
NSLog(@"I am block");
}; //执行
block();
3.带有参数和返回值block
//实例 实现计算两数之和block
//int myAdd(int x,int y); int (^myAdd)(int x,int y)=^int (int x,int y)
{
return x+y;
}; int s=myAdd(,);
NSLog(@"s=%d",s);
4.block捕获外部外部变量(下面代码的_url和_page 为全局变量)
//block使用block外面的变量的注意事项
//int num=10;
__block int val=;
void (^b1)()=^void()
{
//能使用和修改实例变量
_page=;
//block中不能修改局部变量的值
//num++; //block中能修改__block修饰的局部变量
val++; //有可能有警告,因为内存问题引起,注意(用下面的方法)
//__weak typeof(self) weakSelf = self;//block外面定义
//weakSelf.url = @"text";
self.url = @"txt";
}; b1();
5.oc 中应用
(1)NSMutableArray排序(另外定义一个类Dog继承于NSObject)
Dog *huahua=[[Dog alloc] init];
huahua.nickName=@"huahua";
huahua.age=; Dog *miao=[[Dog alloc] init];
miao.nickName=@"miaomiao";
miao.age=; Dog *dahuang=[[Dog alloc] init];
dahuang.nickName=@"dahuang";
dahuang.age=; NSMutableArray *marr=[[NSMutableArray alloc] initWithArray:@[huahua,miao,dahuang]];
//marr sortUsingSelector:<#(SEL)#>//(以前用的方法)
[marr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
Dog *aDog=obj1;
Dog *bDog=obj2;
//return aDog.age>bDog.age;//按年龄升序排序
//按名字排序
return [aDog.nickName compare:bDog.nickName]<;
}]; for(Dog *d in marr)
{
NSLog(@"name = %@ , age = %d",d.nickName,d.age);
}
(2)UIView动画
UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(, , , )];
label.text=@"我是label";
label.backgroundColor=[UIColor redColor];
[self.view addSubview:label]; //向下移动200
[UIView animateWithDuration: animations:^{
CGRect frame=label.frame;
frame.origin.y+=;
label.frame=frame;
} completion:^(BOOL finished) {
NSLog(@"动画结束");
label.transform=CGAffineTransformMakeRotation(M_PI);
[UIView animateWithDuration: animations:^{
CGRect frame=label.frame;
frame.origin.y-=;
label.frame=frame;
} completion:^(BOOL finished) { }];
}];
6.block实现界面反向传值
创建一个视图类SecondViewController继承于UIViewController
(1)在SecondViewController.h文件定义下面的方法
//为了给第二个界面传入block
-(void)setChangeBackgroundColor:(void (^)(NSString *color)) action;
(2)在SecondViewController.m文件实现下面的方法
-(void)btnClick
{
//改变主界面的颜色
if (_action) {
_action(@"blue");
} [self dismissViewControllerAnimated:YES completion:nil];
}
(3)在UIViewController视图实现下面方法
-(void)btnClick
{
SecondViewController *svc=[[SecondViewController alloc] init]; //设置block
[svc setChangeBackgroundColor:^(NSString *color) {
if ([color isEqualToString:@"blue"]) {
self.view.backgroundColor=[UIColor blueColor];
}
}]; [self presentViewController:svc animated:YES completion:nil];
}
经过上面三个步骤就可用block实现界面反向传值(这里传的是视图背景颜色)
ios开发 block语句块的更多相关文章
- iOS开发--Block
iOS开发--Block 1.什么是Block,block 的作用 ui开发和网络常见功能实现回调,按钮的事件处理方法是回调方法以及网络下载后的回调处理 (1)按钮 target-action 一 ...
- iOS开发——Block详解
iOS开发--Block详解 1. Block是什么 代码块 匿名函数 闭包--能够读取其他函数内部变量的函数 函数变量 实现基于指针和函数指针 实现回调的机制 Block是一个非常有特色的语法,它可 ...
- iOS开发 -------- Block技术中的weak - strong
一 Block是什么? 我们使用^运算符来声明一个Block变量,而且在声明完一个Block变量后要像声明普通变量一样,后面要加; 声明Block变量 int (^block)(int) = NULL ...
- iOS开发Block的介绍以及Block的循环引用问题
1:block的循环引用问题最主要记住两点: 如果[block内部]使用[外部声明的强引用]访问[对象A], 那么[block内部]会自动产生一个[强引用]指向[对象A] 如果[block内部]使用[ ...
- iOS开发-Block回调
关于Block之前有一篇文章已经写过一篇文章Object-C-代码块Block回顾,不过写的比较浅显,不能体现出Block在实际开发中的重要性,关于Block的基础知识,可以参考之前的博客.在实际开发 ...
- IOS开发之----代码块的使用(二)
iOS4引入了一个新特性,支持代码块的使用,这将从根本上改变你的编程方式.代码块是对C语言的一个扩展,因此在Objective-C中完全支持.如果你学过Ruby,Python或Lisp编程语言,那么你 ...
- iOS开发Block的使用
Block 是从 iOS4引入的,在日常开发中,会经常用到Block.特别是在多线程中,Block的用处更广泛.而且,Block不仅可以接收参数,其本身也可以作为参数,因此,Block的功能非常强大. ...
- IOS开发 Block的学习
苹果公司正在大力推广Block块语法的使用,据说Block会迟早取代一般协议代理的使用. Block最大的作用是函数回调,简化代码. 在ios中,将blocks当成对象来处理,它封装了一段代码,这段代 ...
- iOS - OC Block 代码块
前言 Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的,类似于一个 ...
随机推荐
- C# Excel 读取为Datatable
最近项目用到的读取Excel 为DataTable 兼容2003.2007.2010.记录一下,以后会用到 引用 NPOI.dll 和 EPPlus.dll using System; using S ...
- Tomcat unable to start
在学习springMvc时,导入springfreemarker 的jar包,写好web.xml,config.xml 后. 部署到tomcat,异常如下: 八月 27, 2016 5:44:41 下 ...
- C语言中的sizeof和strlen
1.sizeof是算符,strlen是函数: 2.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的: 3.大部分编译程序,在编译的时候就把sizeof计算 ...
- 【原创】C++中对象的序列化
1.对象序列化 对象的序列化是指将对象的状态信息转换为可以存储或者传输的形式的过程.对象的反序列化是与序列化相反的过程. 在序列化期间,对象将其当前的状态写入到临时或者永久性的存储区,可以通过从存储区 ...
- HTML5画布(线条、渐变)
绘制直线时,一般会用到moveTo与lineTo两种方法. 案例1: <!DOCTYPE html><html><head lang="en"> ...
- MAC Intellij IDEA 常用快捷键
MAC Intellij IDEA 常用快捷键 Copy by: http://blog.csdn.net/cym492224103/article/details/40077253 Keymap 设 ...
- Funny String
def main(): t = int(raw_input()) for _ in xrange(t): s = raw_input().strip() s_len = len(s) is_funny ...
- Java学习笔记--多线程
rollenholt的博文:http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html 弹球例子: 0. 创建Bounce框架 ...
- [TYVJ] P1003 越野跑
越野跑 背景 Background 成成第一次模拟赛 第二道 描述 Description 为了能在下一次跑步比赛中有好的发挥,贝茜在一条山路上开始了她的训练.贝茜希望能在每次训练中跑 ...
- 深度学习word2vec笔记之算法篇
深度学习word2vec笔记之算法篇 声明: 本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料 ...