iOS開發種傳值方式的總結

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">iOS開發中一般有四種傳值方式,分別是:</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">屬性傳值;</span>

代理傳值;

block傳值;

單例傳值;

屬性傳值是最簡單,也是最常用的從前往後傳值方式。例如,ApushB,同時將A中的一些值傳到B使用,一般給B增加一些屬性(字典,集合,數組),在push的時候,將B的屬性值傳過去,B就可以使用這些值了。

代理傳值一般是用來BpopA時使用的,包括block傳值也是這樣子。

其原理是在B裏面定義代理和block,然後在A裏實現,通過在A實現的時候,利用代理或者block定義時在B裏調用的時候,傳過來的參數,A可以獲取B的值。

而單例傳值則是,在靜態區定義一個類的對象,通過每個人對其某個屬性的值進行更改,從而實現傳值。部分代碼如下,demo傳到了我的資源裏面。

A中的代碼:

- (IBAction)SingleTextFPassvalue:(UIButton *)sender {
    SingleTon *passValue = [SingleTon shareSingleTonValue];
    passValue.passValueStr = _SingleTextF.text;
    SecondViewController *secVC = [[SecondViewController alloc]init];
    [self.navigationController pushViewController:secVC animated:YES];
}
- (IBAction)blockPassValue:(UIButton *)sender {
    
    SecondViewController *secVC = [[SecondViewController alloc]init];
    secVC.passValue = ^(NSString* str){
        self.blockTextF.text = str;
    };
    [self.navigationController pushViewController:secVC animated:YES];
}
- (IBAction)delegatePassValue:(UIButton *)sender {
    SecondViewController *secVC = [[SecondViewController alloc]init];
    secVC.delegate = self;
    
    [self.navigationController pushViewController:secVC animated:YES];
}

-(NSString *)passValue{
    return self.delegateTextF.text;
}
B中的代碼:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    SingleTon *value = [SingleTon shareSingleTonValue];
    self.singleTonPassValue.text = value.passValueStr;
//    __weak SecondViewController *my_self = self;
//    my_self.passValue = ^(NSString *str){
//        self.blockvalue.text = str;
//    };
//    self.blockvalue.text = self.passValue();
    if(self.delegate && [self.delegate respondsToSelector:@selector(passValue)]){
        self.delegateValue.text = [self.delegate passValue];
    }
    
    UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(backAction)];
    [self.navigationItem setLeftBarButtonItem:buttonItem];
}

-(void)backAction{
    self.passValue(self.blockvalue.text);
    [self.navigationController popViewControllerAnimated:YES];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


在使用block時需注意:

第一;block的修飾詞用copy;

第二:在自身使用block的時候,爲了防止循環應用,通常用如下方式:

 //block的循環引用,有可能會造成內存泄露
    //當block是self的一個屬性的時候,我們在block實現體內需要使用到self的時候,有可能會造成循環引用,導致的結果爲self的引用計數有可能爲2,釋放不掉,造成內存泄露。所以我們需要使用__weak關鍵字來修飾self對象,讓該對象在block實現體內不需要內存管理。這個時候引用計數也就不會增加。//在ARC下使用__weak,在MRC下使用__block修飾。
    __weak RootViewController *my_self = self;
    self.circleBlock = ^(){
        my_self.navigationItem.title = @"aaa";
    };




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章