[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] 的区别在哪里?的主要内容,如果未能解决你的问题,请参考以下文章