Objective-C的blocks语法
来源:互联网 发布:知天下资源吧如何下载 编辑:程序博客网 时间:2024/04/29 23:58
OC中的blocks和C++中的函数指针类似,从外观和使用上可以看出
Int(*CFunc)(int a); //C语言的函数指针。 调用 Intret=(CFunc)(10);
Int(^BFunc)(int a); //Blocks 调用 intret=(BFunc)(10);
也可以使用typedef关键字来定义blockstypedef (void)(^BFunc)(int a,int b);
BFunc func=^(int a,int b){
return a+b;
};
func(10,20);即可调用block块。
__blocks关键字
如下代码:
typedef (void)(^BFunc)(int a,int b);__blocks int sum;BFunc func=^(int a,int b){sum=a+b; return sum;};
如果没有__blocks关键字修饰 sum,那么在blocks块中,sum就会提示错误,没有定义
苹果官方建议尽量多用blocks应用。在多线程,异步任务,动画转场用的很多,用在回调时候,可以使用这种机制。
考虑如下情景:
一个Person类,一个Dog类,每个Person有一个Dog,当dog发先情况时候,会通知主人,也就是调用主人的方法。通过协议可以实现,这里使用blocks回调机制来实现:
Person类
#import <Cocoa/Cocoa.h>#import "Dog.h"@interface Person : NSObject {Dog *_dog;}@property (retain)Dog *dog;@end
#import "Person.h"@implementation Person@synthesize dog=_dog;-(void)setDog:(Dog*)thisDog{if(_dog!=thisDog){[_dog release];_dog =[thisDog retain];[_dog setBarkCallback:^(Dog* thisDog,int count){NSLog(@"dog bark infom person ,id %d,count %d",[thisDog ID],count);}];}}-(Dog*)dog{return _dog;}-(void)dealloc{_dog=nil;[super dealloc];}@end
Dog类
#import <Cocoa/Cocoa.h>@interface Dog : NSObject {int _ID;NSTimer *timer;int barkCount;//定义一个blocks变量void (^barkCallback) (Dog *thisDog,int count);}@property (assign) int ID;-(void)setBarkCallback:(void (^)(Dog *thisDog,int count))eachbark;@end
#import "Dog.h"@implementation Dog@synthesize ID=_ID;-(void)updateTimer:(id)arg{NSLog(@"dog %d bark count %d",_ID,++barkCount);//使用blcok来给 Person汇报一下if(barkCallback)barkCallback(self,barkCount);}-(void)setBarkCallback:(void (^)(Dog *thisDog,int barkcount))eachbark{[barkCallback release];barkCallback=[eachbark copy];}-(id) init{if(self=[super init]){timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];}return self;} -(void)dealloc{[barkCallback release];[super dealloc];}@end
主函数
#import <Foundation/Foundation.h>#import "Person.h"#import "Dog.h"int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // insert code here... NSLog(@"Hello, World!");Person *xiaoli=[[Person alloc]init];Dog *dog1=[[Dog alloc]init];[dog1 setID:10];[xiaoli setDog:dog1];[dog1 release];while (1) {[[NSRunLoop currentRunLoop]run];} [pool drain]; return 0;}
运行结果如下:
初学。。多多指教。
- Objective-C的blocks语法
- objective c 中的Blocks语法
- 从C的声明符到Objective-C的Blocks语法
- Objective-C学习之旅(十)----Blocks语法
- 谈Objective-C Blocks的实现 (转载)
- Objective-C的协议、Blocks、Category
- Objective-C中Blocks块的介绍
- Objective-C Blocks
- Objective-C Blocks学习
- Objective-C Blocks学习
- Objective-C Blocks研究
- Objective-C Blocks Quiz
- Objective-C Blocks Caveat
- Objective-C的语法格式
- Objective C 不一样的语法
- Objective-C的基本语法
- objective-c优雅的语法
- objective-c优雅的语法
- 将会有错误和失误的判断
- 最大流问题:增广路径算法的比较
- Oracle中如何插入特殊字符:& 和 ' (多种解决方案)
- 资本需要投入以返回一个高的利润
- 使用 Commons-fileupload 上传文件
- Objective-C的blocks语法
- 信息可用之前制造一个投资决策
- 精通CSS-链接样式
- C# 数据集 DataRow.RowState 属性深入分析
- Android:在任意位置获取应用程序Context
- 用O’Reilly公司的cos实现文件上传
- Get SysInfo (IS2120.CSDN)
- c# 隐藏已打开的窗口,打开登陆窗口
- MFC 获取系统时间