[MyClass alloc] 和 [[self class] alloc] 的区别在哪里?

Posted

技术标签:

【中文标题】[MyClass alloc] 和 [[self class] alloc] 的区别在哪里?【英文标题】:Where's the difference between [MyClass alloc] and [[self class] alloc]? 【发布时间】:2009-08-15 21:26:30 【问题描述】:

我是否有充分的理由不应该做这样的事情? 示例:

我有一个班级MyClass。在那里我有这个实现:

- (id)copyWithZone:(NSZone*)zone 
    MyClass *copy = [[MyClass allocWithZone:zone] init];
    copy.someproperty = [[self.someproperty copy] autorelease];
    return copy;

我发现了一个看起来像这样的 sn-p:

- (id)copyWithZone:(NSZone*)zone 
    MyClass *copy = [[[self class] allocWithZone:zone] init];
    copy.someproperty = [[self.someproperty copy] autorelease];
    return copy;

不同之处在于,如果它自己的类是人类可读的,则第一个只使用名称,就像它是任何其他类一样。第二个问自己这是什么类。这有什么不同吗,或者在这种情况下两者都可以使用?

【问题讨论】:

【参考方案1】:

如果您将MyClass 子类化,则-copyWithZone: 的第二个示例将返回子类的一个实例。第一个例子没有,它返回一个MyClass的实例。

【讨论】:

所以在一个类中,当想要创建同一个类的实例时,应该总是调用 [[self class] alloc] 而不是 [TheClass alloc]? 这取决于子类是否应该处理该方法。在 -copyWithZone: 子类可以通过 super 调用你的方法,做额外的配置然后返回结果。因此,最好使用 [self class]。 子类不一定需要通过super调用它。如果子类自己没有任何额外的变量,它可以直接继承它而无需任何额外的工作 @user102008 是的,但防御方法是假设子类添加 ivars。他们通常会这样做。

以上是关于[MyClass alloc] 和 [[self class] alloc] 的区别在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

new和alloc init的区别

Lua中local变量和非local变量的区别

如何模拟类实例属性?

takes 3 positional arguments but 4 were given错误

python中私有属性的访问

python面向对象