题
此问题可能是关闭基地,但这里是我遇到的问题:
我试图从iPhone SDK运行一个实例,我运行到访问冲突。我跟踪了一些问题,我认为是可疑的。
下面是类的样子:
@interface TableViewCell : UITableViewCell {
@private
UILabel *_earthquakeLocationLabel;
UILabel *_earthquakeDateLabel;
UILabel *_earthquakeMagnitudeLabel;
UIImageView *_magnitudeImageView;
}
当我在设置断点
- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier
和看在调试器“自我”,它表明_earthquakeDateLabel是“0×12”,_earthquakeMagnitudeLabel是0x1000的,而另外两个是零。如果我试图给任何非零的人的,我得到一个访问冲突。
我猜发生了什么事是,这些在他们伪造的值,当我试图给他们,试图减小对虚假值的引用,并炸毁。但正如我说,我是相当新的目标C,所以可能会关闭位置。
所以我的问题是,是否有什么特别的初始化这些值是我应该做的事?或任何方式分配给值时,它在它有一个假的值?
一些额外的信息:
所以,如果我在初始化分配零到_earthquakeDateLabel和_earthquakeMagnitudeLabel,能解决问题。但我不明白为什么对象是与这些字段的值创建的;我希望他们是零。被在堆上创建的对象:
TableViewCell *cell = [[[TableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
没有正确的解决方案
其他提示
这听起来像self
指针是伪造的。值0×12和0×1000是积分常数;他们绝对不是指针到有效的内存地址。您看到这些值的事实表明,什么是错的,并试图操纵他们以任何方式(读或写他们)会导致不良。在这种情况下,你得到一个访问冲突,因为你试图写入内存地址0×12和0×1000,这是无效的地址。
你是如何创建TableViewCell
对象吗?你在干什么TableViewCell *myCell = [[TableViewCell alloc] initWithFrame:...]
?这是正确的方法。
现在我要调用我的心理调试:我的猜的是,你忘了用指针来声明TableViewCell
对象,即你宣布它作为TableViewCell myCell
代替TableViewCell *myCell
(注意星号的存在)。这将创建堆栈,而不是堆上的对象,并且作为结果,它将具有代替零在它的数据成员的垃圾。 Objective-C对象,当适当地分配,将在成功调用NULL
后具有全部初始化为0的数据成员(或nil
,false
或alloc
,取决于数据类型)的