[iOS] Property屬性設定小筆記 & ViewController傳遞資料

剛剛在修改ViewController之間傳遞資料的作法,發現無法順利的傳遞,最後看到他給我exc_bad_access錯誤,靜下心來思考後,發現這是ARC沒設定好的問題。

首先先看一下怎樣在ViewController傳遞資料,假設我們有A和B兩個ViewController,要由A到B,要傳遞的資料叫做data,先不管型別,要作的事情如下:
  1. 在B的head內宣告名為data的property
  2. 在觸發要push到B的code內賦值
  3. 在B的viewDidLoad裡面處理初始化
必須特別說明的是第二步驟,code如下:

BViewController *bVC = [BViewController initWithNibName:@"BViewController" bundle:nil];
bVC.data = someData;
[self.navigationController pushViewController:bVC animated:YES];

注意第一行,initWithNibName其實並不會立刻把view上面的東西都初始化,所以,如果你在第二行是對bVC.labelSome賦值,設定B的label的字串,或是針對B介面上的東西作賦值,都會失敗,所以最好是把資料以字串或是陣列之類的方式讓B儲存,然後在B的viewDidLoad裡面再把這些資料賦值到B的UI上去。

// in BViewController.m

- (void)viewDidLoad
{
    [self.labelSome setText:self.data]; // 假設data是一個字串,那就是這樣設定
}

那麼我遇到的困難是什麼呢?我在上面那行遇到了exc_bad_access的問題。

想了一下後,這其實原因很簡單,因為我對於B的data屬性設定是:

@property (nonatomic, assign) NSString *data;

assign跟weak沒什麼兩樣,因此,當這個值從A送到B之後,因為A被清除了,這個資料的物件的擁有者就沒了,所以在viewDidLoad時就被自然的釋放掉了,這時你應該把屬性設定為:

@property (nonatomic, strong) NSString *data;

改成strong後,該物件就算是交給B擁有了,這樣到了B時,物件就不會被釋放掉了。在ARC裡面,對於物件的擁有權需要小心的思考。

留言