在已經很好的答案中添加一些附加信息。
我創建三個方案,看着所產生的組件從各:
obj1.swift
import Foundation
class MyClass { }
let obj = MyClass()
obj2.swift
import Foundation
class MyClass { }
let obj: AnyObject = MyClass()
obj3.swift
import Foundation
class MyClass { }
let obj: AnyObject = MyClass()
obj.isKindOfClass(MyClass.self)
obj1和obj2之間的差異是微不足道的。涉及的對象類型的任何指令具有不同的值:
movq %rax, __Tv3obj3objCS_7MyClass(%rip)
# ...
globl __Tv3obj3objCS_7MyClass .globl __Tv3obj3objPs9AnyObject_
.zerofill __DATA,__common,__Tv3obj3objCS_7MyClass,8,3
# ...
.no_dead_strip __Tv3obj3objCS_7MyClass
VS
movq %rax, __Tv3obj3objPs9AnyObject_(%rip)
# ...
.globl __Tv3obj3objPs9AnyObject_
.zerofill __DATA,__common,__Tv3obj3objPs9AnyObject_,8,3
# ...
.no_dead_strip __Tv3obj3objPs9AnyObject_
完全兩種here。
這對我來說很有意思。如果兩個文件之間的唯一區別是對象類型的名稱,爲什麼聲明爲AnyObject
的對象可以執行Objective-C選擇器?
OBJ 3顯示了isKindOfClass:
選擇是如何觸發:
OBJ 2和OBJ 3
here之間
LBB0_2:
# ...
movq __Tv3obj3objPs9AnyObject_(%rip), %rax
movq %rax, -32(%rbp)
callq _swift_getObjectType
movq %rax, -8(%rbp)
movq -32(%rbp), %rdi
callq _swift_unknownRetain
movq -24(%rbp), %rax
cmpq $14, (%rax)
movq %rax, -40(%rbp)
jne LBB0_4
movq -24(%rbp), %rax
movq 8(%rax), %rcx
movq %rcx, -40(%rbp)
LBB0_4:
movq -40(%rbp), %rax
movq "L_selector(isKindOfClass:)"(%rip), %rsi
movq -32(%rbp), %rcx
movq %rcx, %rdi
movq %rax, %rdx
callq _objc_msgSend
movzbl %al, %edi
callq __TF10ObjectiveC22_convertObjCBoolToBoolFVS_8ObjCBoolSb
movq -32(%rbp), %rdi
movb %al, -41(%rbp)
callq _swift_unknownRelease
xorl %eax, %eax
addq $48, %rsp
# ...
LBB6_3:
.section __TEXT,__objc_methname,cstring_literals
"L_selector_data(isKindOfClass:)":
.asciz "isKindOfClass:"
.section __DATA,__objc_selrefs,literal_pointers,no_dead_strip
.align 3
"L_selector(isKindOfClass:)":
.quad "L_selector_data(isKindOfClass:)"
差異。
isKindOfClass
作爲動態調度方法發送,如_objc_msgSend
所示。這兩個對象都暴露給Objective-C,如SwiftObject
(.quad _OBJC_METACLASS_$_SwiftObject
),聲明對象的類型爲AnyObject
完成了橋接到NSObjectProtocol
。
但是'AnyObject'被定義爲'@objc public protocol AnyObject {}'這是否意味着所有'@ objc'協議符合'NSObjectProtocol'? 「Any」呢? – JAL
這並不意味着。我在說我在說什麼,而不是其他的東西。 – matt
你的意思是「像MyClass這樣的毫無根據的類是不可能的。」那麼你是說'MyClass'繼承自'SwiftObject'嗎?爲什麼只向'AnyObject'強制轉換符合'NSObjectProtocol'? – JAL