亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

block怎么用

發布時間:2021-11-22 15:41:45 來源:億速云 閱讀:207 作者:小新 欄目:開發技術

這篇文章主要介紹了block怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

block語法

 1.代理協議和通知的區別 :兩者的對象直接的耦合性不同.通知的代碼的可讀性太差.  代理,通知,block三種通信都實現了對象之間的解耦合. 通知的通信方式是1對多;代理,block是1對1

2.block(閉包):與函數相似,是一個匿名的函數代碼快,此代碼可以作為參數傳遞給其他對象

3. /*

   局部的基本數據類型變量,進入到block中,num會變成常量。如果需要在block中對num進行修改,需要加上關鍵字__block (我們也可以用static關鍵字進行修飾,也可以設置成全局變量)

         */

        __blockint num = 10;

        MyBlock block1 = ^{

            NSLog(@"num is %d", num);

            //當沒有加上__block時,錯誤,不能對常量進行自加操作

            num++;

        } 

        num = 20;

        block1();

        NSLog(@"num is %d", num);

        /*

         局部的OC對象進入到block時, 該對象會被retain一次,如果用__block修飾則不會(注意: block在堆區上時才會起到retain作用,所以下面要對block進行一次copy操作,將block從棧區copy到堆區上)

         */

        __blockNSObject *obj = [[NSObjectalloc] init];

        NSLog(@"%ld", obj.retainCount);

        MyBlock block2 = ^{

            NSLog(@"%ld", obj.retainCount);

        };

        [block2 copy];//將block copy到堆區上一份,就不會再受棧區的影響(那么會將這個Block copy到堆上分配,這樣就不再受棧的限制,可以隨意使用啦)

        block2();

        __blockPerson *ps = [[Personalloc] init];

        MyBlock block3 = ^{

            NSLog(@"%ld", ps.retainCount);

        };

        [block3 copy];

        block3();

        [ps release];

        [block3 release];

4.Block的內存管理

在block里面引用一個實例變量(成員變量)時,該變量所在的對象會被retain一次

// self -> btn -> block -> self造成循環引用,斷掉block->self 

//  __blockSecondViewController *secondVC = self;創建secondVC作為self的中間變量(在SecondViewController類的內部 ,且在MRC情況下) 

  //在ARC中,__block關鍵字不能解決循環引用的問題,因為即使使用了__block關鍵字,它仍舊是一個strong類型的對象,進入到block塊時,仍舊會被block持有,這個時候__block關鍵字起的作用僅僅只是表示該指針變量進入到block塊是是一個可修改的變量.所以使用__weak,使類與對象之間產生弱引用關系

    __weakSecondViewController *weakSelf = self;

    BaseButton *btn = [[BaseButtonalloc] initWithFrame:CGRectMake(200, 200, 100, 100) WithBlock:^(UIButton *btn) {

        //通常情況下,在block塊中,我們再將__weak對象轉換成一個strong對象,為了更方便拿到自身的成員變量

        __strongSecondViewController *strongSelf = weakSelf;

        [strongSelf.navigationControllerpopViewControllerAnimated:YES];

5.自定義類BlockAlertView.m文件中

 復寫父類多參數的方法,需要引入C語言的庫函數#import <stdarg.h>

- (instancetype)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegatecancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...

{

    self = [superinitWithTitle:title message:message delegate:selfcancelButtonTitle:cancelButtonTitle otherButtonTitles:otherButtonTitles,nil];

        //獲取多參數中otherButtonTitles后面的多參數

        //定義一個指針函數

    va_list p;

    id test;//列表中的指針所指向的下一個參數

    if (otherButtonTitles) {//如果otherButtonTitles存在,則遍歷列表,如果不存在,則就不是多參數,無需遍歷

        va_start(p, otherButtonTitles);

        while ((test = va_arg(p, id))) {//如果取到列表中的參數

            [selfaddButtonWithTitle:test];//就給將參數添加到AlertView上,并給title賦值

        }

        va_end(p);

    }

    returnself;

}

在控制器RootViewController.m文件中,調用BlockAlertView的復寫父類的初始化多參數方法

BlockAlertView *alert =[[BlockAlertViewalloc]initWithTitle:@"歡迎"message:@"HelloWorld"delegate:selfcancelButtonTitle:@"取消"otherButtonTitles:@"確定", @"退出",@"不再提示",@"再次提醒",nil];

    alert.block = ^(NSInteger index){

        NSLog(@"index----%ld",index);

    };

    [alert show];

感謝你能夠認真閱讀完這篇文章,希望小編分享的“block怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

勐海县| 贵阳市| 新丰县| 八宿县| 黑山县| 盈江县| 南乐县| 鄯善县| 广宁县| 四子王旗| 钟山县| 井陉县| 邛崃市| 和田县| 平湖市| 和平县| 富川| 巴彦县| 上饶市| 清丰县| 花垣县| 宜宾市| 平南县| 海口市| 平武县| 旌德县| 莱阳市| 抚顺市| 昭觉县| 通化市| 融水| 商丘市| 安宁市| 邳州市| 绵竹市| 安国市| 南昌市| 福贡县| 兴和县| 杨浦区| 鹤岗市|