开发者

Cocoa ivar losing value between init and drawRect

I am not a complete n00b here, but I feel like I must be missin开发者_Python百科g something essential. I'm passing a variable into a new class instance via the class's init method:

@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;
}

The output from NSLog() does show the correct value here. Now, the drawRect: method that is then triggered to draw the view, has a similar call:

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

And this time the NSLog() reports Side as nil! Stepping through it with the debugger, I see the value for side gets set, then it goes into the registers (all those hex codes that I don't understand), then when it jumps out again into the drawRect: method, the value is simply nil.

If anyone can shed light on this I'd appreciate it!

Cheers, Aaron


This is usually the way to write a property for NSString*. assign is used for primitive types (it doesn't increment the retain count for an object), and either retain or copy for Objects.

 @property (readwrite, copy) NSString * side


I'm going to go ahead and guess the most common cause for this kind of bug: You're dealing with two different objects. You're initializing the view in your code and you also have an instance in a nib. The two instances are completely separate objects, so when the view that is visible performs its drawRect:, it doesn't see the other one's instance variable.

The problem with your property that other people are pointing out is also definitely true, but I suspect this bug is actually hiding that one.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜