【知識總結】block 中使用返回對象

Person

@interface Person : NSObject
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, assign) NSString *name;
@end

方法生成一個 Person 對象,block 延時 3 秒后回調,模仿異步回調過程

- (Person *)personConfige:(void(^)())complete{
    
    Person *person = [Person new];
    person.name = @"000";
    person.age = 1111;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        !complete?:complete();
    });
    
    return person;
}
測試一:
    Person *person = [self personConfige:^{
        NSLog(@"person : %@ ", person); // 為 nil
    }];

運行結果:
    person : (null) 
解析:

person 為 nil宁脊,block 捕獲的 person 即為 nil;
personConfige 返回對象給 person 后,person 指向新生成的 對象,但是 block 中捕獲的 person 依然指向原先的 nil配椭,因此輸出為:null

測試二:
    Person *testP = [Person new];
    NSLog(@"testP : %@ ", testP);
    Person *person = [self personConfige:^{
        NSLog(@"person : %@ ", person); // 為 nil
        NSLog(@"block testP : %@ ", testP);  // 存在
        NSLog(@"block testP.age : %ld, name: %@", testP.age, testP.name);
    }];
    testP = person;

運行結果:
    testP : <Person: 0x6000000345a0> 
    person : (null) 
    block testP : <Person: 0x6000000345a0> 
    block testP.age : 0, name: (null)
解析:

如下圖,1雹姊,testP 指向新生成的對象股缸,block 獲取 testP,block_testP 的引用也指向 testP 引用的對象吱雏;
2敦姻,personConfige 返回新生成的對象給 person,testP 的指針指向 person 引用的對象
3歧杏,testP 的指針雖然發(fā)生變化了替劈,但是 block_testP 的指針沒有改變,還是引用原來的對象得滤,因此 block 中打印的還是最初的 testP 對象

Paste_Image.png

因此陨献,block 中如果想要獲取到方法中返回的對象,有一下兩種做法:
原理:

對 blockTestP 引用的地址進行操作

方法一:
    Person *testP = [Person new];
    NSLog(@"testP : %@ ", testP);
    Person *person = [self personConfige:^{
        NSLog(@"person : %@ ", person); // 為 nil
        NSLog(@"block testP : %@ ", testP);  // 存在
        NSLog(@"block testP.age : %ld, name: %@", testP.age, testP.name);
    }];
    testP.age = person.age;
    testP.name = person.name;

運行結果:
    testP : <Person: 0x608000029880> 
    person : (null) 
    block testP : <Person: 0x608000029880> 
    block testP.age : 1111, name: 000

將 person 對象的屬性一個一個賦值給 testP 對象

方法二:
    NSMutableArray *arr = [NSMutableArray arrayWithObject:@-1];
    Person *person2 = [self personConfige:^{
        
        Person *blockPer = arr.firstObject;
        NSLog(@"blockPer: %@", blockPer);
        NSLog(@"name: %@, age : %ld", blockPer.name, blockPer.age);
    }];
    NSLog(@"person2: %@", person2);
    arr[0] = person2;

運行結果:  
    person2: <Person: 0x618000036620>
    blockPer: <Person: 0x618000036620>
    name: 000, age : 1111
圖解:
Paste_Image.png
方法三:

推薦做法:利用 __block

    __block Person *person1 = nil;
    person1 = [self personConfige:^{
        NSLog(@"person : %@ ", person1); // 為 nil
    }];

  /**
     __block Person *person1 = [self personConfige:^{
         NSLog(@"person : %@ ", person1); // 為 nil
     }];
   */

結果:

2017-06-05 11:17:09.818614 單利-繼承關系[4504:2175415] person : <Person: 0x17002d800>
分析:

block 捕獲 arr懂更,通過 arr 獲取第一個保存的對象眨业。對 arr 中保存的對象進行修改,arr 指向的還是原來的地址沮协,隱藏 block_arr 能夠獲取到修改的對象

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末龄捡,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子慷暂,更是在濱河造成了極大的恐慌聘殖,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件行瑞,死亡現場離奇詭異奸腺,居然都是意外死亡,警方通過查閱死者的電腦和手機血久,發(fā)現死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門突照,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人氧吐,你說我怎么就攤上這事讹蘑∧┛” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵座慰,是天一觀的道長陨舱。 經常有香客問我,道長版仔,這世上最難降的妖魔是什么隅忿? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮邦尊,結果婚禮上背桐,老公的妹妹穿的比我還像新娘。我一直安慰自己蝉揍,他們只是感情好链峭,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著又沾,像睡著了一般弊仪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杖刷,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天励饵,我揣著相機與錄音,去河邊找鬼滑燃。 笑死役听,一個胖子當著我的面吹牛,可吹牛的內容都是我干的表窘。 我是一名探鬼主播典予,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乐严!你這毒婦竟也來了瘤袖?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤昂验,失蹤者是張志新(化名)和其女友劉穎捂敌,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體既琴,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡占婉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了呛梆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锐涯。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡磕诊,死狀恐怖填物,靈堂內的尸體忽然破棺而出纹腌,到底是詐尸還是另有隱情,我是刑警寧澤滞磺,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布升薯,位于F島的核電站,受9級特大地震影響击困,放射性物質發(fā)生泄漏涎劈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一阅茶、第九天 我趴在偏房一處隱蔽的房頂上張望蛛枚。 院中可真熱鬧,春花似錦脸哀、人聲如沸蹦浦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盲镶。三九已至,卻和暖如春蝌诡,著一層夾襖步出監(jiān)牢的瞬間溉贿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工浦旱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宇色,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓颁湖,卻偏偏與公主長得像代兵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子爷狈,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容

  • 一植影、深復制和淺復制的區(qū)別? 1涎永、淺復制:只是復制了指向對象的指針思币,即兩個指針指向同一塊內存單元!而不復制指向對象的...
    iOS_Alex閱讀 1,368評論 1 27
  • 簡述 一句話搞懂block:可以理解為羡微,block是對上下文代碼段的打包谷饿,然后在適當的時機執(zhí)行。 block長什么...
    Allan_野草閱讀 2,158評論 0 25
  • 1妈倔、截取字符串”20 | http://www.baidu.com”中博投,”|”字符前面和后面的數據,分別輸出它們 ...
    強子ly閱讀 2,934評論 8 46
  • Block使用場景盯蝴,可以在兩個界面的傳值毅哗,也可以對代碼封裝作為參數的傳遞等听怕。用過GCD就知道Block的精妙之處。...
    Coder_JMicheal閱讀 721評論 2 1
  • 設計模式是什么虑绵? 你知道哪些設計模式尿瞭,并簡要敘述? 設計模式是一種編碼經驗翅睛,就是用比較成熟的邏輯去處理某一種類型的...
    Jt_Self閱讀 738評論 0 4