2011-05-19 31 views
2

我看到一個奇怪的情況,其中一個實例變量的簡單賦值不起作用。右手對象非零,但拒絕分配給實例變量(具有相同類型)。這在應用程序中並不一致。分配一個不工作的ivar

我有這樣一個類:

@interface FooViewController : UIViewController { 
    UIView *contentView; 
    BOOL testBool; 
} 
@end 
@implementation FooViewController 
- (void)viewDidLoad { 
    UIView *theContentView = [[UIView alloc] initWithFrame:self.view.bounds]; 

    // this assignment fails for some reason: 
    contentView = [theContentView retain]; 
    /* at this point, contentView == nil */ 

    UIView *bar = theContentView; // this works 
    testBool = YES; // this works 
} 
@end 

和這樣的一個子類:

@interface BarViewController : FooViewController { 
} 
@end 

當我從筆尖,實例化BarViewController在當執行獲取到viewDidLoad中定義超類,上述奇怪的行爲發生。實例變量「拒絕分配」。

但是,如果我將一個虛擬實例變量添加到子類,則預期的行爲將返回。實例變量在viewDidLoad中正確分配。

我在使用Xcode 4.0.2的模擬器中在iOS 4.3的運行時看到了這個。這在LLVM + GCC和GCC中都會發生。

這不是孤立地發生。當我在一個測試項目中嘗試這個時,它正常運行。

+1

爲什麼不只是'contentView = [[UIView alloc] initWithFrame:[[self view] bounds]];'? – 2011-05-19 05:07:00

+1

你確定viewDidLoad被調用?您是否已經在調試器中逐步完成了任務,以查看ContentView和contentView的值? – sbooth 2011-05-19 05:07:40

+0

@dave是的,我可以做到這一點,但潛在的問題仍然存在。我在這個例子中簡化了代碼。即使添加ivar專門用於調試和分配它不起作用。這就像ivars根本就沒有分配任務。 – 2011-05-19 05:17:14

回答

0

對不起,但我不相信你。

我的第一個問題是你如何確定contentView等於零?你有一個斷點後的任務?如果你在任務中斷線,那條線還沒有被執行,所以contentView將在這一點上爲零。

如果您使用其他方法測試contentView,則可能只是viewDidLoad尚未運行。

顯示我的輸出:

- (void)viewDidLoad { 
    UIView *theContentView = [[UIView alloc] initWithFrame:self.view.bounds]; 

    // this assignment fails for some reason: 
    contentView = [theContentView retain]; 
    /* at this point, contentView == nil */ 

    NSLog(@"theContentView: %p", theContentView); 
    NSLog(@"contentView: %p", contentView); 

    UIView *bar = theContentView; // this works 
    testBool = YES; // this works 
} 

如果他們不同,我會開始相信你。 (好吧,也許不是,我仍然會考慮你說謊的可能性。)

+0

我發佈這個問題的原因很奇怪。當然,我在賦值之後設置了一個斷點,並檢查它是否實際調用了viewDidLoad。否則,我怎麼會知道這些值,如testBool和酒吧得到正確分配?我正在尋找一個更深入的答案,爲什麼上面的代碼在一個新項目中工作,但沒有爲我的項目中的任何原因工作。 – 2011-06-01 13:10:57

+0

@Jess,我相信你可以同意你的問題如此令人難以置信,以至於你更容易誤解你的情況。 – 2011-06-01 13:39:09

+0

@Jess,順便說一句,我仍然希望看到上面的NSLogs的輸出,只是爲了確保它不僅僅是一個調試器問題,而且代碼實際運行良好。 – 2011-06-01 13:50:56