为什么不同的集合合方法中的相同代码工作方式不同?

ice*_*lon 1 objective-c ios synthesize

setProgramsetGraphic方法中我们有相同的代码:

NSLog(@"%@", self.display);  
Run Code Online (Sandbox Code Playgroud)

但是,输出显示self.display是setProgram,但它是一个UILable对象setGraphic.

是什么导致了不同的结果?display是IBOutlet并且program是NSArray对象.虽然program是SOGraphicViewController的模型,但我将从另一个控制器传递程序的值[segue.destinationViewController setProgram: self.brain.program].

@interface SOGraphicViewController ()
@property (nonatomic, weak) IBOutlet graphicView *graphic;
@end

@implementation SOGraphicViewController

@synthesize program = _program;
@synthesize graphic = _graphic;
@synthesize display = _display;

- (void)setProgram:(id)program {
    _program = program;
    [self.graphic setNeedsDisplay];
    NSLog(@"%@", self.display);
}

- (void)setGraphic:(graphicView *)graphic {
    _graphic = graphic;
    self.graphic.dataSource = self;
    NSLog(@"%@", self.display);
}
Run Code Online (Sandbox Code Playgroud)

bbu*_*bum 8

假设您的属性都是IBOutlets,那么最好的猜测是在XIB加载期间调用setter并在其间display设置programgraphic设置.

也就是说,由于XIB未归档,因此在重构对象时会调用setter.订单未定义.

(这让我很开心;当我第一次了解NIB装载时,我遇到了同样的困惑〜23年前.顺便说一下:你可以离开我的草坪.)

鉴于这些是出口,没有必要打电话setNeedsDisplay.实际上,你根本不应该覆盖setter.

此外,类名始终以大写字母开头.