2009-05-30 70 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,具体取决于数据类型)。