如何在Objective C中设置未初始化的值?

时间:2009-05-30 14:43:18

标签: objective-c uikit

这个问题可能不合适,但这就是我遇到的问题:

我正在尝试从iPhone SDK运行示例,而且我遇到了访问冲突。我已经找到了一些我认为可疑的行为。

以下是该课程的内容:

@interface TableViewCell : UITableViewCell {

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

当我在

中设置断点时
- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier

在调试器中查看“self”,它显示_earthquakeDateLabel为“0x12”,_ EarthquakeMagnitudeLabel为0x1000,其他两个为零。如果我尝试分配给非零的任何一个,我会收到访问冲突。

我猜测正在发生的事情是它们中有伪造值,当我尝试分配它们时,试图减少对虚假值的引用并且爆炸。但正如我所说的,我对Objective C很新,所以我可能会偏离基础。

所以我的问题是,关于初始化我应该做的这些值有什么特别之处吗?或者当它中有伪造值时分配给它的任何方式?


其他一些信息:

因此,如果我在初始化时将_larthquakeDateLabel和_earthquakeMagnitudeLabel指定为nil,则可以解决问题。但我不明白为什么用这些字段中的值创建对象;我希望他们是零。正在堆上创建对象:

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

1 个答案:

答案 0 :(得分:1)

听起来self指针是虚假的。值0x12和0x1000是整数常量;它们绝对不是指向有效内存地址的指针。您看到这些值的事实表明某些事情是错误的,并且试图以任何方式操纵它们(读取或写入它们)将导致不良。在这种情况下,您将获得访问冲突,因为您正在尝试写入内存地址0x12和0x1000,这些地址是无效地址。

您是如何创建TableViewCell个对象的?你在做TableViewCell *myCell = [[TableViewCell alloc] initWithFrame:...]吗?这是正确的方法。

现在我要调用我的通灵调试器:我的猜测是你忘记用指针声明你的TableViewCell对象,即你将它声明为{ {1}}代替TableViewCell myCell(请注意星号的存在)。这将在堆栈而不是堆上创建对象,因此,它将在其数据成员中使用垃圾,而不是零。正确分配后,Objective-C对象将在成功调用之后将其所有数据成员初始化为0(或TableViewCell *myCellNULLnil,具体取决于数据类型) false