2011-09-20 136 views
2

我有一個自定義類BoardMatchData,其中包含關於國際象棋比賽的信息。爲什麼我的實例變量零,即使我設置它?

我還得到了一個名爲BoardViewController的自定義UIViewController,當用戶從列表中選擇一個匹配項時就會分配這個UIViewController。

下面是從我創建BoardViewController片斷,設置它的委託,然後設置新BoardMatchData:

Games *selectedGame = [[self fetchedResultsController] objectAtIndexPath:indexPath]; 
    if (!self.bvc) { 
     NSLog(@"Alloc-ing a BVC"); 
     self.bvc = [[BoardViewController alloc] init]; 
     self.bvc.delegate = self; 
    } 
    [self.bvc setNewBoardMatchData:[MasterViewController boardMatchDataFromGame:selectedGame]]; 

調試時,我可以看到這個方法setNewBoardMatchData被調用,它有有效的數據來進去。但是,稍後在BoardViewController中,此boardMatchData總是似乎爲零。這裏的setNewBoardMatchData方法:

- (void)setNewBoardMatchData:(BoardMatchData *)newBoardMatchData { 
    NSLog(@"BMD is being set"); 
    if (self.boardMatchData != newBoardMatchData) { 
     self.boardMatchData = newBoardMatchData; 
     [self configureView]; 
    } 
    if (self.masterPopoverController != nil) { 
     [self.masterPopoverController dismissPopoverAnimated:YES]; 
    } 

} 

並在BoardViewController.h,我只是有一個實例變量:

BoardMatchData *boardMatchData; 

方法聲明:

- (void)setNewBoardMatchData:(BoardMatchData *)newBoardMatchData; 

然後在BoardMatchData頂部.m,我有:

@interface BoardViewController() 
@property (strong, nonatomic) UIPopoverController *masterPopoverController; 
@property (nonatomic,retain) BoardMatchData *boardMatchData; 
- (void)configureView; 
@end 

@synthesize boardMatchData = _boardMatchData;

......我這裏的目的是要確保setter只是被自己調用,而不是被其他對象調用。

我想如何設置self.boardMatchData有什麼問題嗎?

我沒有做任何保留/發佈,因爲我使用ARC。

編輯:

迦勒 - 我這樣做,@synthesize聲明作爲我擺擺手周圍的部分試圖找到這個bug。原來我有:

@synthesize boardMatchData;

......我剛剛切換回來。行爲是一樣的; self.boardMatchData總是結束爲零,即使在我設置它之後。

我想現在我只有一個伊娃,boardMatchData,我總是通過self.boardMatchData訪問它。

我該如何防止它成爲零?

回答

2
@synthesize boardMatchData = _boardMatchData; 

這是說的訪問者應該使用伊娃爲_boardMatchData,但你也有一個名爲boardMatchData伊娃。如果您使用訪問器,則只會設置_boardMatchData。由於Objective-C在創建對象時會自動清除任何ivars,因此 ivar將始終爲零。

0

Aha;我發現這個問題,有幾乎相同的問題:

Objective-C – Retained property after being set is nil?

有沒有結論的那一個,但最後的建議是,「嘗試登錄自己的-viewDidLoad和-viewWillAppear和-queueFinished地址。像NSLog(@「self is%p」,self);並確保它們是相同的。「

我自己做了,現在看到在initWithNibName/configureView/setNewBoardMatchData中,我看到一個指向自己的指針,然後當viewDidLoad運行時,我得到一個不同的指針!

我不知道如何或爲什麼,但這顯然是問題(我已經設置boardMatchData後,我的類的新實例正在實例化)。

編輯:

雖然上面使我發現這個錯誤(我得到我BoardViewController的多個版本)的路徑,它不是完整的答案。我想在這裏添加任何人都應該找到並且處於相同的位置。

我實際上是在Xcode4中使用故事板,並且Apple提供了Core Data的master-detail模板。

當我實例化我的細節控制器(BoardViewController)時,我在做一個alloc/init。我應該簡單地引用[segue destinationViewController],因爲segue已經爲我實例化了一個版本。 我沒有提供足夠的上下文來實際到達根目錄

0

您的評論(您發佈爲答案,您不應該這樣做)表明您在兩個不同的實例上工作。

這裏有幾個可能的原因:

  1. self.bvc只是assign屬性,而不是retain
  2. 您可以從一個筆尖中加載一個,並且在您的代碼 (如圖所示)中構建一個 - 這可能是最像一個的。也許你只是 忘了連接插座。
  3. 您的設置self.bvcnil某處,以便您繼續創建新的 實例。
相關問題