【问题标题】:Will this work?这行得通吗?
【发布时间】:2011-02-01 11:42:34
【问题描述】:
UILabel *testLbl = [[self alloc] init];

这就是混乱的开始:

通常最好使用 self 以外的变量来引用类中的实例 方法:

+ (id)rectangleOfColor:(NSColor *)color {
id newInstance = [[Rectangle alloc] init]; // GOOD [newInstance setColor:color]; return [newInstance autorelease];
}

实际上,与其在类方法中将alloc消息发送给类,不如将alloc消息发送给self。这样,如果类被子类化,并且被子类接收到了 rectangleOfColor: 消息,返回的实例将与子类的类型相同(例如,NSArray 的数组方法被 NSMutableArray 继承)。

+ (id)rectangleOfColor:(NSColor *)color {
id newInstance = [[self alloc] init]; // EXCELLENT [newInstance setColor:color]; return [newInstance autorelease];
}

【问题讨论】:

  • 表示两者有什么区别: UILabel *testLbl = [[self alloc] init]; UILabel *testLbl = [[UILabel alloc] init];
  • 你是在 UILabel 实例方法中运行这个吗?那么你可以使用[[[self class] alloc] init];

标签: objective-c


【解决方案1】:

不会,会导致“UILable undeclared (first use in this function)”错误。

【讨论】:

    【解决方案2】:

    不,它不会起作用。在您的第一行中,您将alloc 消息发送到类的实例。在您从 Apple 文档中复制的示例中,它们将 alloc 消息发送到 Class Rectangle。不同之处在于您的行(显然)在实例方法内部,Apple 的示例在类方法内部。 There is a difference.

    就像@Denis 提到的那样,你可以通过说[[[self class] alloc] init] 来做你想做的事情,但实际上,不要这样做。您几乎永远不需要它提供的灵活性,它只会混淆新对象的意图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 2012-01-14
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多