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
}

你可能感兴趣的:(iPhone开发)