IOS學習之block代碼塊


前言:

   block這個名詞對於做一般開發者來說可能會覺得稀奇古怪而非常陌生,但是對於iOS工程師來說,在整個開發中到處都是它的影子,今天一大早覺得在假期學習一下它,對明年的iOS開發工作做個准備,突然有點找回當年即將畢業時的最后一個春節假期的感覺,今天基於最近使用的角度來學習總結一下block。

什么是Block?

   block是對象,它封裝了一段代碼,這段代碼可以在任何時候執行。block可以作為函數參數或者函數的返回值,而其本身又可以帶輸入參數或返回值。它和傳統的函數指針很類似,但是有區別:block是inline的,並且它對局部變量是只讀的,^是block語法的標識。

聲明block

 第一種方式:用typedef定義一個block類型

typedef void (^Sucess)(NSString*);//用typedef定義一個block類型

@property (nonatomic,copy) Sucess myBlock;

第二種方式:也可以通過標准的block函數體

@property (nonatomic,copy) void(^myBlock)(NSString*);

完整的block: NSString* (^callBack) (NSString *)

第一個參數:block返回值

第二個參數:block名字

第三個參數:block回調參數

 NSString* (^callBack) (NSString *) =^(NSString *string){
        NSMutableString *  tempString=[[NSMutableString alloc]initWithString:@"I wanna to know "];
        return [tempString stringByAppendingString:string];
    } ;
    NSString *result=callBack(@"who is lcj ?");
    
    NSLog(@"result ----> %@",result);

block訪問變量

    int num=0;
    
    int (^plus) (int ,int )=^(int a,int b)
    {
        num=a+b;
        
        return num;
    };
    
    int finalNum=plus(5,6);
    NSLog(@"finalNum--->%d",finalNum);

比如上面這種方式是編譯不通過的,block可以訪問局部變量,但是不能修改。如果要修改就要加關鍵字:__block,修改后如下

    __block int num=0;
    
    int (^plus) (int ,int )=^(int a,int b)
    {
        num=a+b;
        
        return num;
    };
    
    int finalNum=plus(5,6);
    NSLog(@"finalNum--->%d",finalNum);

 block循環引用

   循環引用就是當self 擁有一個block的時候,在block 又調用self的方法。形成你中有我,我中有你,誰都無法將誰釋放的困局。舉例說明:

在block中處理viewController的全局變量str

    void(^dealString)(void)=^{
        
        self.str=@"who is lcj ?";
    };
    
    dealString();

如何解決?使用weakSelf,換言之類似Android中的弱引用

__weak typeof (self) weakSelf = self;

上面的修改成下面這種方式就可以解決循環引用問題

    __weak typeof (self) weakSelf = self;
    void(^dealString)(void)=^{
        
        weakSelf.str=@"who is lcj ?";
    };
    
    dealString();

總結:

   今天大致總結了最近在開發中使用block的幾個心得體會,后續更多block的高級使用再做總結。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM