Cocoa ivar在init和drawRect之间失去了价值

时间:2010-12-31 02:57:12

标签: objective-c cocoa nsview

我不是一个完整的n00b,但我觉得我必须遗漏一些必要的东西。我通过类的init方法将一个变量传递给一个新的类实例:

@synthesize side;

- (id)initWithSide:(NSString *)aSide frame:(NSRect)frameRect
{
    if (self = [super initWithFrame:(NSRect)frameRect]) {
        self.side = aSide;
    }
    NSLog(@"Side is %@", self.side);
    return self;
}

NSLog()的输出确实在这里显示正确的值。现在,drawRect:方法然后被触发以绘制视图,具有类似的调用:

- (void)drawRect:(NSRect)rect
{
    NSLog(@"Side is %@", self.side);

这次NSLog()报告Side为零!使用调试器逐步执行它,我看到side的值被设置,然后它进入寄存器(所有那些我不理解的十六进制代码),然后当它再次跳转到drawRect:方法时,值为简直没有。

如果有人能说清楚这一点,我会很感激!

干杯, 亚伦

2 个答案:

答案 0 :(得分:2)

这通常是为NSString *编写属性的方法。 assign用于基本类型(它不会增加对象的保留计数),并保留或复制对象。

 @property (readwrite, copy) NSString * side

答案 1 :(得分:1)

我将继续猜测这种错误的最常见原因:你正在处理两个不同的对象。您正在初始化代码中的视图您还在nib中有一个实例。这两个实例是完全独立的对象,因此当可见的视图执行其drawRect:时,它不会看到另一个实例变量。

其他人指出你的财产问题也是肯定的,但我怀疑这个错误实际上是隐藏了那个。