@objc在后台做什么?

时间:2018-08-24 11:04:42

标签: ios objective-c swift

我在Apple文档中找不到与此相关的任何内容。

这是一个场景。

Objective-C类:

@implementation Superclass

- (instancetype)init {
    self = [super init];
    [self doSomething];
    return self;
}

- (void)doSomething {
    NSLog(@"\ndoSomething called from Superclass\n");
}

@end

快速子类:

class Subclass: Superclass {

    override init() {
        super.init()
        doSomething()
    }

    @objc func doSomething() {
        print("\n\ndoSomething called from Subclass\n")
    }

}

在子类@objc的方法签名中使用doSomething导致超类中的方法永远不会被调用,即仅doSomething called from Subclass被打印到控制台。

删除@objc可解决此问题。

这是为什么?

2 个答案:

答案 0 :(得分:2)

@objc使该方法可用于Objective-C运行时, 在《 Swift语言参考》中比较here。 因此

@objc func doSomething()

覆盖

- (void)doSomething 
在Objective-C超类中定义的

实例方法。因此,如果selfSubclass的实例,则

[self doSomething];

调用子类方法–无论调用在何处完成。 (消息分发在Objective-C中是完全动态的。) 这就是为什么子类方法被调用两次的原因。

没有@objc,Swift实例方法对Objective-C不可见, 并且不会覆盖超类方法。

答案 1 :(得分:0)

当@objc用于类声明时,意味着您使用Swift编写了Objective-C类。

@objc用于方法声明意味着实际上将使用Objective-C的String,{{1}来代替swift的DictionaryNotificationNSString等。 },NSDictionary和方法在Objective-C代码中可用。