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に表示する.
ここでは、実装値部分のコードのみを添付します.control 1のbutton実装方法では、weakで修飾されたコントローラcontrol 1が自分を指していることを定義しています.weakのオブジェクトを使用しないと、次のblockの実装に警告が表示され、メモリの漏洩を示すことができます.
Capturing self strongly in this block is likely to lead to retain cycle、retain cycle、簡単に言えば甲が乙を引用し、乙が甲を引用し、双方が相手の解放を待っているうちに、輪が形成され、メモリエラーが発生した。
//---------------------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の実装に警告が表示され、メモリの漏洩を示すことができます.