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回调接口 ...
随机推荐
- ElasticSearch常用结构化搜索
最近,需要用到ES的一些常用的结构化搜索命令,因此,看了一些官方的文档,学习了一下.结构化查询指的是查询那些具有内在结构的数据,比如日期.时间.数字都是结构化的. 它们都有精确的格式,我们可以对这些数 ...
- Android-TextView属性ellipsize多行失效的解决思路
多余文字显示省略号的常规做法 android:ellipsize="end" //省略号显示在末尾 android:ellipsize="middle" //省 ...
- Java创建和解析Json数据方法(五)——Google Gson包的使用
(五)Google Gson包的使用 1.简介 Gson包中,使用最多的是Gson类的toJson()和fromJson()方法: ①toJson():将java对象转化为json数据 ...
- springboot配置filter
Filter 过滤器是web开发中很重要的一个组件,下面以一个session登陆的例子介绍下spring boot中如何使用Filter 首先要准备一个实现了Filter的接口的类 SessionFi ...
- Objective-C 协议(protocol)二
我们前面提到了OOP的继承,我们说Objective-C不像C++可以有多重继承,Objective-C是单一继承的,如果想要做到一个类别同时拥有多种型别的能力,我们就可以通过协议来实现.Object ...
- OpenGL step to step(1)
在窗体上绘制一个矩形,just a demo #include <GLUT/GLUT.h> void init() { glClearColor(0.0,0.0,0.0,0.0); glS ...
- Mac环境下安装运行splash
http://blog.csdn.net/chenhy8208/article/details/69391097 最近需要使用scrapy爬虫做一些开发,用到了splash.我本机是mac环境,跳着看 ...
- Mac下安装和使用GunPG(GPG)
GPG是加解密的工具,亦可以用于签名.非对称加解密.需要公钥和私钥. mac下安装:brew install gpg 使用gpg工具校验下载文件的完整性,从官网下载KEYS和asc文件:gpg --i ...
- oralce中相关的概念整理
[数据库名] 概念:就是一个数据库的标识,作用等同于我们的身份证的作用,假设一台机器上安装了多个数据库,那么每一个数据库都会有一个数据库名称相应,这些数据库名称在数据库被创建的时候,数据库名称也会被 ...
- C 标准库 - <stdlib.h>
C 标准库 - <stdlib.h> 简介 stdlib .h 头文件定义了四个变量类型.一些宏和各种通用工具函数. 库变量 下面是头文件 stdlib.h 中定义的变量类型: 序号 变量 ...