關(guān)于Block

1.Block基本用法:

  • block聲明
    返回值(^block變量名)(參數(shù))
    void(^block)();

  • block定義

//第一種
void(^block1)() = ^{
};
// 第二種,如果沒有參數(shù),參數(shù)可以隱藏,如果有參數(shù),必須寫,而且必須要有參數(shù)變量名
void(^block2)(int) = ^(int a){
};
// 第三種,不管有沒有返回值,都可以省略
int(^block3)() = ^int{
    return 3;
};
  • block調(diào)用

    block1();

2.Block別名:

// 類型別名:BlockType
typedef void(^BlockType)();

3.定義為屬性

// block如何聲明,就如何定義成屬性
@property (nonatomic, strong) void(^block)();

4.應(yīng)用地點(diǎn)

  • Block可以在一個(gè)方法中定義, 在另外一個(gè)方法調(diào)用
  • Block可以在一個(gè)類中定義, 在另外一個(gè)類中調(diào)用

5.Delegate傳值

5.1.頭文件中生成協(xié)議,聲明代理展姐,

@protocol ModalViewControllerDelegate <NSObject>
@optional
// 設(shè)計(jì)方法:想要代理做什么事情
- (void)modalViewController:(ModalViewController *)modalVc sendValue:(NSString *)value;
@end

@interface ModalViewController : UIViewController
@property (nonatomic, weak) id<ModalViewControllerDelegate> delegate;
@end

5.2.m文件中,傳值給ViewController

if ([_delegate respondsToSelector:@selector(modalViewController:sendValue:)]) {
    [_delegate modalViewController:self sendValue:@"123"];
}

5.3.想要得到值的控制器中息裸,遵循協(xié)議舀锨,成為代理岭洲,重寫代理方法

@interface ViewController ()<ModalViewControllerDelegate>
modalVc.delegate = self;
// 重寫代理方法
- (void)modalViewController:(ModalViewController *)modalVc sendValue:(NSString *)value{
}

6.Block傳值

6.1.頭文件中聲明Block屬性
@property (nonatomic, strong) void(^block)(NSString *value);

6.2.m文件中,傳值給ViewController

if (_block) {
    _block(@"123");
}

6.3.想要得到值的控制器中坎匿,定義Block

ModalViewController *modalVc = [[ModalViewController alloc] init];
modalVc.block = ^(NSString *value) {
    NSLog(@"%@",value);
};

7.Block是不是對(duì)象?

  • 答案是肯定的盾剩。

8.MRC中Block內(nèi)存管理

  • Block引用外部局部變量在棧,否則在全局區(qū)替蔬。
  • Block只能用copy不能用retain告私,用copy才在堆中。

9.ARC中Block內(nèi)存管理

  • Block只要引用外部局部變量就在堆, 否則在全局區(qū)承桥。
  • Block最好使用strong驻粟,不用copy。他們的結(jié)果是相同的凶异,但是copy的內(nèi)部處理要比strong麻煩得多蜀撑,長(zhǎng)此以往性能較低。

10.由Block引起的內(nèi)存泄漏

10.1.block循環(huán)引用場(chǎng)景:

  • self強(qiáng)引用了block剩彬,block里面也強(qiáng)引用了self(block會(huì)自動(dòng)把block塊內(nèi)的強(qiáng)指針強(qiáng)引用):
@property (nonatomic, strong) void(^block)();
_block = ^(){
    //_name相當(dāng)于 self -> name, 所以還是有self的
    _name = @"123";
};
  • 解決方案
__weak typeof(self) weakSelf = self;
_block = ^(){
    weakSelf.name = @"123";
};

10.2.因?yàn)閎lock酷麦,self不被銷毀場(chǎng)景:

  • 當(dāng)其他對(duì)象(可能是全局變量)強(qiáng)引用了block,block中又強(qiáng)引用了self喉恋。也會(huì)導(dǎo)致self不能被銷毀沃饶,但這個(gè)不是循環(huán)引用。
  • 解決方案:
    __weak typeof(self) weakSelf = self;

11.然而有時(shí)候轻黑,block中用weakSelf不安全绍坝。為什么?

__weak typeof(self) weakSelf = self;
  • 因?yàn)槿绻鸼lock中有一個(gè)延遲執(zhí)行的block苔悦,block中又使用了weakSelf轩褐。執(zhí)行時(shí)候self很可能已經(jīng)被銷毀(block里面對(duì)他是弱引用)。
  • 解決方案
    __strong typeof(weakSelf) strongSelf = weakSelf;

12.Block使用場(chǎng)景

12.1.Block變量傳遞

  • 局部變量, 是值傳遞
  • 靜態(tài)變量,全局變量,__block修飾的變量, 都是指針傳遞
__block int a = 3;
void(^block)() = ^{
    NSLog(@"%d",a);
};
a = 5;
block();

12.2.Block作為參數(shù)傳遞

- (void)cacultor:(NSInteger (^)(NSInteger))cacultorBlock{
    if (cacultorBlock) {  
        _result =  cacultorBlock(_result);
    }
}
CacultorManager *mgr = [[CacultorManager alloc] init];
[mgr cacultor:^(NSInteger result){
    result += 5;
    result += 6;
    result *= 2;
    return result;
}];

12.3.Block作為返回值

CalculatorManager *mgr = [[CalculatorManager alloc] init];
mgr.add(5).add(5).add(5).add(5);
- (CalculatorManager *(^)(int))add{
    return ^(int value){ 
        _result += value;
        return self;
    };
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玖详,一起剝皮案震驚了整個(gè)濱河市把介,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蟋座,老刑警劉巖拗踢,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異向臀,居然都是意外死亡巢墅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來君纫,“玉大人驯遇,你說我怎么就攤上這事⌒钏瑁” “怎么了叉庐?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)会喝。 經(jīng)常有香客問我陡叠,道長(zhǎng),這世上最難降的妖魔是什么肢执? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任枉阵,我火速辦了婚禮,結(jié)果婚禮上预茄,老公的妹妹穿的比我還像新娘兴溜。我一直安慰自己,他們只是感情好反璃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著假夺,像睡著了一般淮蜈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上已卷,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天梧田,我揣著相機(jī)與錄音,去河邊找鬼侧蘸。 笑死裁眯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的讳癌。 我是一名探鬼主播穿稳,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼晌坤!你這毒婦竟也來了逢艘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤骤菠,失蹤者是張志新(化名)和其女友劉穎它改,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體商乎,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡央拖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲜戒。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡专控,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袍啡,到底是詐尸還是另有隱情踩官,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布境输,位于F島的核電站蔗牡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嗅剖。R本人自食惡果不足惜辩越,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望信粮。 院中可真熱鬧黔攒,春花似錦、人聲如沸强缘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旅掂。三九已至赏胚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間商虐,已是汗流浹背觉阅。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秘车,地道東北人典勇。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叮趴,于是被迫代替她去往敵國(guó)和親割笙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容