剛剛在修改ViewController之間傳遞資料的作法,發現無法順利的傳遞,最後看到他給我exc_bad_access錯誤,靜下心來思考後,發現這是ARC沒設定好的問題。
首先先看一下怎樣在ViewController傳遞資料,假設我們有A和B兩個ViewController,要由A到B,要傳遞的資料叫做data,先不管型別,要作的事情如下:
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裡面,對於物件的擁有權需要小心的思考。
首先先看一下怎樣在ViewController傳遞資料,假設我們有A和B兩個ViewController,要由A到B,要傳遞的資料叫做data,先不管型別,要作的事情如下:
- 在B的head內宣告名為data的property
- 在觸發要push到B的code內賦值
- 在B的viewDidLoad裡面處理初始化
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裡面,對於物件的擁有權需要小心的思考。
留言
張貼留言