block用法

OC

  • block類型實(shí)例變量:回傳值(^名字)(參數(shù)列);
  • typedef 回傳值(^名字)(參數(shù)列);
  • 實(shí)現(xiàn)體:^(參數(shù)列){} 如果沒(méi)有參數(shù)可以省略參數(shù)列和圓括弧
  • 形參類型:(回傳值(^)(參數(shù)列))名字
  • 返回一個(gè)block:(回傳值(^)(參數(shù)列))名字:(參數(shù)類型)參數(shù)名,...

Swift

  • block類型實(shí)例變量:名字:(參數(shù)列表)->(返回值)
  • typedef 名字 = (參數(shù)列表)->(返回值)
  • 實(shí)現(xiàn)體:{[捕獲值列表](參數(shù)列表)in 語(yǔ)句}
  • 形參類型:名字:(參數(shù)列表)->(返回值)

C 函數(shù)

  • block類型實(shí)例變量: 回傳值 (*名字)(參數(shù)列)
  • typedef 回傳值 (*名字)(參數(shù)列)
  • 實(shí)現(xiàn)體: 好像沒(méi)有帶參數(shù)、返回值之類的匿名函數(shù)塊
  • 形參類型: 回傳值(*名字)(參數(shù)列)
  • 返回一個(gè)函數(shù):回傳值(*名字((參數(shù)類型)參數(shù)名1,...))(參數(shù)列)

arc問(wèn)題

arc是引用類型的來(lái)說(shuō)的。值類型的內(nèi)存管理與arc無(wú)關(guān)。arc內(nèi)存管理操作方法:可變拷貝, 不可變拷貝 const, 保持強(qiáng)引用, 保持弱引用
1.給類成員變量賦值
2.給臨時(shí)變量賦值
3.函數(shù)傳參
4.閉包捕獲
5.作為函數(shù)/閉包的返回值返回

深拷貝,淺拷貝是另一個(gè)概念


apple object copying
apple object copying
內(nèi)存管理.png

參考:

-(void)test_7 {
    NSMutableString *p2 = [NSMutableString stringWithString:@"111111111"];
    void (^block)(NSString *p) = ^(NSString *p) {
        NSLog(@"%@", p);
        NSString *p3 = p2;
        p3 = @"33333";
    };
    NSLog(@"%@", p2);
    block(@"helloworld");
    NSLog(@"%@", p2);
    NSLog(@"test6 end!!");
}
-(void)test_6 {
    NSMutableString *p2 = [NSMutableString stringWithString:@"111111111"];
    void (^block)(NSString *p) = ^(NSString *p) {
        NSLog(@"%@", p);
        NSMutableString *p3 = p2;
        [p3 appendString:@"2222222"];
    };
    NSLog(@"%@", p2);
    block(@"helloworld");
    NSLog(@"%@", p2);
    NSLog(@"test6 end!!");
}
-(void)test_5 {
    NSMutableString *p2 = [NSMutableString stringWithString:@"111111111"];
    void (^block)(NSString *p) = ^(NSString *p) {
        NSLog(@"%@", p);
        [p2 appendString:@"2222222"];
    };
    NSLog(@"%@", p2);
    block(@"helloworld");
    NSLog(@"%@", p2);
    NSLog(@"test5 end!!");
}
-(void)test_4 {
    CLGeocoder *coder = [[CLGeocoder alloc]init];
    CLLocation *locaiont = [[CLLocation alloc]initWithLatitude:39.2610740000 longitude:117.1818350000];
    __block NSDictionary *result;
    dispatch_group_t group  = dispatch_group_create();
    dispatch_group_enter(group);
    [coder reverseGeocodeLocation:locaiont completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        if (error) {
            NSLog(@"%@",error);
            
        } else {
            for ( CLPlacemark * i in    placemarks) {
                NSLog(@"%@",   i.addressDictionary);
                result = i.addressDictionary;
                break;
            }
        }
        dispatch_group_leave(group);
    }];
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"%@",  result );
    });
    NSLog(@"test 4end!!!!");
}
-(void)test_3 {
    __block  NSMutableString *p = [NSMutableString string];
    dispatch_group_t group  = dispatch_group_create();
    dispatch_group_enter(group);
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)  , ^{
        sleep(5);
        [p appendString: @"hellworooldd!!!!"];
        [p appendString: @"3333333!!!!"];
        [p appendString: @"4444444!!!!"];
        dispatch_group_leave(group);
        
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"%@",  p );
    });
    NSLog(@"end!!!!");
}
-(void)test_2 {
    __block  NSString *p = @"helo";
    dispatch_group_t group  = dispatch_group_create();
    dispatch_group_enter(group);
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)  , ^{
        sleep(5);
        dispatch_group_leave(group);
        p = @"hellworooldd!!!!";
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"%@",  p );
    });
    NSLog(@"end!!!!");
    
}
-(void)test_1 {
    self.str = @"111111";
    [self performSelectorOnMainThread:@selector(modifyStr) withObject:nil waitUntilDone:false];
    //    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    //        NSLog(@"%@",   self.str);
    //        sleep(3);
    //        NSLog(@"%@",   self.str);
    //    });
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        NSString *p  =  self.str;
        NSLog(@"%@",   p);
        sleep(3);
        NSLog(@"%@",   p);
    });    NSLog(@"test end...");
}
-(void)modifyStr {
    dot;
    self.str = @"222222";
}

作為一個(gè)閉包,它需要具備的原則

1,block捕獲值,不能被外面的修改而被修改。
2,block捕獲值,修改捕獲的值,外面可以用到被修改后的結(jié)果。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 《Objective-C高級(jí)編程》是一本有趣又難懂的書,全書就講了引用計(jì)數(shù)、Block、GCD三個(gè)概念,有趣是因?yàn)?..
    kamous閱讀 55,516評(píng)論 22 206
  • 一、 block語(yǔ)法格式,如下 //return type (^BlockName)(list of argume...
    原野de呼喚閱讀 2,547評(píng)論 2 5
  • ios4.0系統(tǒng)已開始支持block,在編程過(guò)程中,block被Obj-C看成是對(duì)象,它封裝了一段代碼,這段代碼可...
    Asserts閱讀 2,905評(píng)論 0 3
  • 前言 本文用最基本的界面通訊(傳個(gè)字符串)來(lái)舉例子, 傳遞時(shí)要分清楚, 控制器出現(xiàn)的先后順序.(當(dāng)傳遞數(shù)據(jù)時(shí), 下...
    GX_Dust閱讀 3,104評(píng)論 0 5
  • 這是我們啟程前往麗江的一個(gè)月前的一天。
    貓爪丁丁閱讀 196評(píng)論 0 0

友情鏈接更多精彩內(nèi)容