gpt4 book ai didi

objective-c - 为什么类方法中的 "self = [[Rectangle alloc] init]"是 BAD?

转载 作者:太空狗 更新时间:2023-10-30 03:30:06 26 4
gpt4 key购买 nike

在 Apple 的文档“Objective-C Programming Language”中,第 48 页说:

+ (Rectangle *)rectangleOfColor:(NSColor *) color
{
self = [[Rectangle alloc] init]; // BAD
[self setColor:color];
return self;
}

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


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

一个不好,一个好,一个优秀。这是为什么?

最佳答案

还有第四种模式....

(1) 类型不匹配是不好的。

(2) 对类的静态引用产生在子类中行为不正确的方法

(3)动态引用类意味着子类将被实例化为子类实例


(4)

+ (instancetype)rectangleOfColor:(NSColor *)color // Über-bestest evar!
{
Rectangle *newInstance = [[self alloc] init];
[newInstance setColor:color];
return newInstance;
}

llvm 添加了 instancetype 关键字,表示“哟!此方法返回调用它的任何类的实例”。因此,如果您要对上述内容进行子类化,您可以:

RectangleSub *rs = [RectangleSub rectangleOfColor:[NSColor paisleyColor]];

但这会警告(除了可怕的颜色选择之外):

RectangleSub *rs = [Rectangle rectangleOfColor:[NSColor puceColor]];

而 (id) 返回类型在第二种情况下不会发出警告。

请注意,我还将已声明的 newInstance 切换为明确的 Rectangle* 类型。这也更好,因为在该方法的上下文中newInstance 只能被安全地视为Rectangle*

关于objective-c - 为什么类方法中的 "self = [[Rectangle alloc] init]"是 BAD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15436662/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com