在类别中调用[super init]是否与在子类中做相同的事情?如果不是,有什么不同?
发布于 2011-05-29 21:52:31
不,他们做了不同的事情。想象一下这样的类结构:NSObject => MyObject => MySubclass,假设您在MyObject上有一个名为MyCategory的类别。
现在,从MyCategory调用类似于从MyObject调用,因此super指向NSObject,而调用[super init]则调用NSObject的-init方法。但是,从子类super调用MyObject,因此使用<代码>d14进行初始化将调用MyObject的-init方法,该方法的行为与d17的不同。
这两种行为是不同的,所以在使用类别进行初始化时要小心;类别不是子类,而是对当前类的添加。
发布于 2011-05-29 21:54:32
在下面的示例中,super将调用UIView init (而不是UINavigationBar init方法)
@implementation UINavigationBar (ShadowBar)
- (void)drawRect:(CGRect)rect {
//draw the shadow ui nav bar
[super init];
}
@end如果您将其子类化,[super init]将调用UINavigationBar初始化方法。
所以,是的,如果你要在UINavigationBar init中做一些额外的事情(额外的来自UIView),它们会做不同的事情。
发布于 2011-05-29 22:08:04
编辑:以下内容建立在一个有缺陷的前提下,请看josh的回答。
不删除,这仍然是一个有趣的参考,因为它可能会让你误入歧途。
它们是一样的..。在没有引用任何外部讨论的情况下,我们可能会有你说我应该……“用学术答案回答学术问题”。
@implementation categoryTestViewController (ShadowBar)
- (void)viewDidAppear:(BOOL)animated {
//draw the shadow ui nav bar
NSLog(@"super's class = %@, self's class %@",[super class],[self class]);
if ([self class] == [super class]) {
NSLog(@"yeah they are the same");
}
}
@end输出:
2011-05-29 08:06:16.198 categoryTest[9833:207] super's class = categoryTestViewController, self's class categoryTestViewController
2011-05-29 08:06:16.201 categoryTest[9833:207] yeah they are the same调用超级viewDidAppear:将导致不调用任何内容...不是循环,所以我不知道它到底在那里做什么。
https://stackoverflow.com/questions/6168058
复制相似问题