objective-c的代码块block
一、block
1.bock是由于^开头,括号里面填写参数类型。
标准代码块:
返回值 (^代码块名称) (参数类型) = ^(参数) {方法体};
2.我们的块即可以定义在函数内或者对象方法内,也可以定义在函数外或则对象方法外.m文件内。
3.定义在对象方法内或者函数内代码块可以访问函数内部的变量或者对象方法中的属性。
4.外部代码块可以对对象中得属性进行修改或者指针中的数据,对于基本数据类型是不可以修改的。
5.内部block中修改函数的内部变量时,需要对被需改得变量前增加__block使调用block时将其传入到block中。
6.在定义代码块的时候,我们应该注意,如果对象的中的.m文件定义一个与其他对象.m文件中得代码块会报同名错误。
main.h
#import <Foundation/Foundation.h>
#import "Person.h"
//定义在外面的代码块
void (^myblock) (int) = ^(int i) { NSLog(@"this is block%i",i); } ; //测试对象得代码块
void testPeronBlock(){
//对象内调用代码块
Person *p = [[Person alloc]init];
NSString *myname = [NSString stringWithFormat:@"小明"];
p.name = myname;
[p say]; } //调用外部block
void outerBlock(){
//带参数的块
myblock();
}
/**
改变值
*/
void changA(){
//尝试该变其值,由于是形参所以不可以改变a得值
int a = ;
void (^changA) (int) = ^(int i) {
i = ;
} ;
changA(a);
NSLog(@"A得值为 %i",a); }
/**
函数内得block
*/
void functionBlock(){
//函数内的代码块
void (^printMessage) (void)= ^(void) {
NSLog(@"this is block");
};
// 调用block
printMessage();
}
/**
修改外部变量的值
*/
void changb(){
__block int b =;
void (^changB) (void) = ^(void) {
NSLog(@"%i",b);
b =; //如果想要修改外部得变量得值,我们必须在变量得前面添加__block否则会报错,
NSLog(@"%i",b);
};
changB(); } int main(int argc, const char * argv[]) {
@autoreleasepool { // functionBlock();
// outerBlock();
// changA();
testPeronBlock();
// changb();
}
return ;
}
person.h
//
// Person.h
// Block
//
#import <Foundation/Foundation.h> @interface Person : NSObject
@property(atomic,retain) NSString * name;
-(void)say;
@end
Person.m
//
// Person.m
// Block
// #import "Person.h" @implementation Person // 第一个*号是nsstring的返回值,
NSString * (^myblock2)(NSString *) = ^(NSString * name){
NSLog(@"%@ say something",name);
return name;
};
//修改对象属性代码块
void (^changeName)(Person *) =^(Person * p){
p.name = @"张三";
};
-(void)say{
changeName(self);
myblock2(_name);
//方法内的代码块可以访问函数得属性
void (^inerProperty)(void) = ^(void) {
NSLog(@"访问内部属性NAME %@",self.name);
//内部block可以修改对象中的属性。但是函数中要特殊处理才能修改外部得变量
self.name = @"内部block修改name";
NSLog(@"%@",self.name);
};
inerProperty();
} @end
objective-c的代码块block的更多相关文章
- 04OC之分类Category,协议Protocol,Copy,代码块block
一.Protocol协议 我们都知道,在C#有个规范称之为接口,就是规范一系列的行为,事物.在C#中是使用Interface关键字来声明一个接口的,但是在OC中interface是用来声明类,所以用了 ...
- [转]iOS代码块Block
代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返回值,特殊地,Block还可以保存一段代码,在需要 ...
- iOS学习之代码块(Block)
代码块(Block) (1)主要作用:将一段代码保存起来,在需要的地方调用即可. (2)全局变量在代码块中的使用: 全局变量可以在代码块中使用,同时也可以被改变,代码片段如下: ;//注意:全局变量 ...
- 从C#到Objective-C,循序渐进学习苹果开发(4)--代码块(block)和错误异常处理的理解
本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本文继续上一篇随笔<从 ...
- Objective-C-----协议protocol,代码块block,分类category
概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,本文将重点介绍objective-C中一些常用的语法特性. 当然这些内容虽然和其他高级语言 ...
- 代码块(block)的使用
Objective-C语法之代码块(block)的使用 代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值. 脱 ...
- 一篇文章看懂iOS代码块Block
block.png iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返 ...
- Objective-C 代码块(block)的使用
代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值. 脱字符(^)是块的语法标记.按照我们熟悉的参数语法规约所定 ...
- Objective-C语法之代码块(block)的使用
代码块本质上是和其它变量相似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你能够像调用其它标准函数一样,传入參数数,并得到返回值. 脱字符(^)是块的语法标记.依照我们熟悉的參数语法规约所定 ...
- 代码块(Block)回调一般阐述
本章教程主要对代码块回调模式进行讲解,已经分析其他回调的各种优缺点和适合的使用场景. 代码块机制 Block变量类型 Block代码封装及调用 Block变量对普通变量作用域的影响 Block回调接口 ...
随机推荐
- react-1 react需要的环境配置
一.nodeJs简介和安装 1. 官网 https://nodejs.org/en/ NPM https://www.npmjs.com/ 2.检查安装成功的命令 node -v np ...
- windows命令行更改IP地址
修改IP地址时,提示出现一个意外情况 netsh interface ip set address "以太网" static 192.168.3.151 255.255.255.0 ...
- 多协议底层攻击工具Yesinia
多协议底层攻击工具Yesinia Yesinia是一款底层协议攻击工具.它提供多种运行模式,如终端文本模式.GTK图形模式.NCurses模式.守护进程模式.它利用各种底层协议的漏洞实施攻击,支持 ...
- 【Todo】Java并发学习 & 示例练习及代码
接上一篇:http://www.cnblogs.com/charlesblc/p/6097111.html <Java并发学习 & Executor学习 & 异常逃逸 & ...
- Solidworks安装完成提示failed to load slderresu.dll怎么办
安装完成出现下面的一系列错误提示 进入到语言包,重新安装中文语言包即可 可以正常打开和运行了
- Objective C block背后的黑魔法
前言 block在Objective C开发中应用非常广泛,我们知道block会捕获外部对象,也知道使用block要防止循环引用. "知其然而不知其所以然"是一件非常痛苦的事情,那 ...
- soap webservice
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://cnn237111.blog.51cto.com/2359144/1357029 ...
- surface 通过U盘 镜像恢复系统
1. 在恢复之前首先要解锁bitlocker(如果你的surface没有加锁就不需要这个步骤) 在另一台电脑上登录bitlocker锁绑定的微软账号,查询密钥,在需要的地方输入这个密钥(不经过这个操作 ...
- 简单的看Unicode和UTF-8的区别
作者:uuspider链接:http://www.zhihu.com/question/23374078/answer/65352538来源:知乎著作权归作者所有,转载请联系作者获得授权. 举一个例子 ...
- jsp页面设置绝对路径
例子: 设置完之后就随便jsp页面放在哪个文件夹都可以加载到资源了 <%@ page language="java" contentType="text/html; ...