iphone开发学习,Block
基本使用:
void (^vFun)()=^(void){ NSLog(@"void function"); }; vFun();//void function
//void:返回类型
//(^vFun):vFun代表函数名
//(xx):传入参数的类型,为空代表木有参数
//^(xxx):block格式,xxx代表传入参数
int (^iFun)(int) = ^(int i){ return i; }; NSLog(@"%d",iFun(12345));//12345 NSString *str = @"World"; NSString* (^sFun)(NSString *, int)= ^(NSString *s1, int i){ return [s1 stringByAppendingString:str]; }; str = @"Max"; NSLog(@"%@",sFun(@"Hello ",2));//Hello World
对于sFun,创建block对象时,此对象只会捕获当前引用值。以后引用值怎么变,只会使用之前的值。
内存管理:
Block对象可以发送retain等消息,但Block分配于栈,函数运行结束,系统会自动释放。
让计数器+1,可以使用copy消息。
保留Block对象的作用:1.在Block对象的函数外能执行此Block对象。
2.保存Block对象引用的对象。
使用__block修饰符,系统不再保留Block对象内,指针所指向的对象。
如上sFun()方法,在str方法前添加__block,sFun显示:Hello Max
__block NSString *str = @"World";
Block对象内使用实例变量,self retainCount+1.
可以使用局部变量。
//@property (nonatomic, strong)NSString *name; - (void)method{ //NSString *s = name;//name为实例变量. void (^aBolck)()=^(void){ NSLog(@"Hello, %@", name); }; void (^aCopy)()=[aBolck copy]; aCopy(); NSLog(@"%d", [self retainCount]);//不使用局部变量,值为2 }