2009-05-30 105 views
0

這個問題可能是偏離基礎,但這裏是我遇到的問題:如何在Objective C中設置未初始化的值?

我想從iPhone SDK運行一個示例,並且遇到訪問衝突。我追查了一些我認爲可疑的行爲。

這裏的類的樣子:

@interface TableViewCell : UITableViewCell { 

@private  
    UILabel *_earthquakeLocationLabel; 
    UILabel *_earthquakeDateLabel; 
    UILabel *_earthquakeMagnitudeLabel; 
    UIImageView *_magnitudeImageView; 
} 

當我在

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier 

設置一個斷點,看在調試器的「自我」,它表明_earthquakeDateLabel是「×12」, _earthquakeMagnitudeLabel是0x1000,另外兩個是零。如果我嘗試分配給任意一個非零的字符,我會遇到訪問衝突。

我在猜測發生了什麼事情,這些都是假的價值觀,當我嘗試分配給他們時,會試圖減少對虛假價值的引用並炸燬。但正如我所說,我對Objective C相當陌生,所以我可能會脫離基地。

所以我的問題是,有什麼特別的初始化這些值,我應該做的?或者有任何方式來分配值時,它有一個虛假的價值?


一些額外的信息:

所以,如果我在初始化分配到零和_earthquakeDateLabel _earthquakeMagnitudeLabel,能解決問題。但我不明白爲什麼用這些字段中的值創建對象;我希望他們是零。對象正在堆上創建:

TableViewCell *cell = [[[TableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease]; 

回答

1

聽起來像self指針是假的。值0x12和0x1000是整數常量;它們絕對不是指向有效內存地址的指針。你看到這些價值觀的事實表明某些事情是錯誤的,試圖以任何方式操縱它們(讀或寫)都會導致不良。在這種情況下,您正在嘗試訪問存儲器地址0x12和0x1000,這是無效地址。

你是如何創建TableViewCell對象的?你在做TableViewCell *myCell = [[TableViewCell alloc] initWithFrame:...]?這是正確的方法。

現在我要調用我的心理調試:我猜測是,你忘了用指針來聲明TableViewCell對象,即你聲明爲TableViewCell myCell,而不是TableViewCell *myCell(注意存在星號)。這將在棧上而不是在堆上創建對象,因此,它的數據成員中將會有垃圾,而不是零。 Objective-C對象在正確分配時,將在成功調用alloc後,將其所有數據成員初始化爲0(或NULL,nilfalse,具體取決於數據類型)。