IOS-block実装ページ間の転送値

1802 ワード

Blockを利用して2つのページ間の伝達値を実現し、2つのコントローラcontrol 1とcontrol 2があると仮定し、control 1にlabelとbuttonがあり、buttonをクリックしてcontrol 2にジャンプし、control 2にbuttonとtextFieldがあり、control 2のbuttonをクリックしてcontrol 1に戻り、textFieldに入力した文字をcontrol 1のlabelに表示する.
//---------------------control2.h
#import 

typedef void(^ChangeTextBlock) (NSString *text);

@interface ModalViewController : UIViewController

// block
@property (nonatomic, copy) ChangeTextBlock block;

@end


//----------------------control2.m
- (void) backAction: (UIButton *) button {
    
    //1)  
    UITextField *textField = (UITextField *)[self.view viewWithTag:2000];
    
    //2)   -----》  block 
    if (self.block != nil) {
        self.block(textField.text);
    }
    
    //3)  
    [self dismissViewControllerAnimated:YES completion:nil];
 
}

//---------------------control1.m
- (void) buttonAction: (UIButton *) button {
    
    //1.  block, __weak : 
    __weak Controller1 *control1 = self;
    
    //2. block 
    _modalViewController.block = ^(NSString *text) {
        // __weak ,  ------>  
        UILabel *label = (UILabel *) [control1.view viewWithTag:1000];
        label.text = text;
    };
    
    //3.  
    _modalViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

    //4.  
    [self presentViewController:_modalViewController animated:YES completion:nil];
    
}

ここでは、実装値部分のコードのみを添付します.control 1のbutton実装方法では、weakで修飾されたコントローラcontrol 1が自分を指していることを定義しています.weakのオブジェクトを使用しないと、次のblockの実装に警告が表示され、メモリの漏洩を示すことができます.

Capturing self strongly in this block is likely to lead to retain cycle、retain cycle、簡単に言えば甲が乙を引用し、乙が甲を引用し、双方が相手の解放を待っているうちに、輪が形成され、メモリエラーが発生した。