首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在纯Swift中声明一个协议@objc和让它符合NSObjectProtocol有什么区别呢?

在纯Swift中声明一个协议@objc和让它符合NSObjectProtocol有什么区别呢?
EN

Stack Overflow用户
提问于 2016-05-25 16:46:37
回答 2查看 834关注 0票数 8

考虑两个Swift协议:

代码语言:javascript
运行
复制
@objc protocol SomeProtocol { }

protocol SomeOtherProtocol: NSObjectProtocol { }

声明Swift协议@objc与使其符合NSObjectProtocol之间有什么区别?我知道没有@objc的任何协议都不会连接到Objective,但是这两个声明在一个纯Swift应用程序中有什么区别呢?据我所知,@objc应该通过顶级SwiftObject使SomeProtocolNSObjectProtocol保持一致。

EN

Stack Overflow用户

发布于 2016-05-25 16:58:05

我发现的一个不同之处是,遵循NSObjectProtocol协议将把Objective符号信息加载到编译好的Swift二进制文件中。请参见下面生成的程序集:

代码语言:javascript
运行
复制
l__PROTOCOL_NSObject:
    .quad   0
    .quad   L___unnamed_2
    .quad   0
    .quad   l__PROTOCOL_INSTANCE_METHODS_NSObject
    .quad   0
    .quad   l__PROTOCOL_INSTANCE_METHODS_OPT_NSObject
    .quad   0
    .quad   l__PROTOCOL_PROPERTIES_NSObject
    .long   80
    .long   0
    .quad   l__PROTOCOL_METHOD_TYPES_NSObject

    .private_extern l_OBJC_LABEL_PROTOCOL_$_NSObject
    .section    __DATA,__objc_protolist,coalesced,no_dead_strip
    .globl  l_OBJC_LABEL_PROTOCOL_$_NSObject
    .weak_definition    l_OBJC_LABEL_PROTOCOL_$_NSObject
    .align  3
l_OBJC_LABEL_PROTOCOL_$_NSObject:
    .quad   l__PROTOCOL_NSObject

    .private_extern l_OBJC_PROTOCOL_REFERENCE_$_NSObject
    .section    __DATA,__objc_protorefs,coalesced,no_dead_strip
    .globl  l_OBJC_PROTOCOL_REFERENCE_$_NSObject
    .weak_definition    l_OBJC_PROTOCOL_REFERENCE_$_NSObject
    .align  3
l_OBJC_PROTOCOL_REFERENCE_$_NSObject:
    .quad   l__PROTOCOL_NSObject

    .section    __DATA,__const
    .align  3
l___unnamed_3:
    .quad   1
    .quad   l__PROTOCOL_NSObject

    .globl  __TMp3obj10MyProtocol
    .align  3
__TMp3obj10MyProtocol:
    .quad   0
    .quad   L___unnamed_1
    .quad   l___unnamed_3
    .quad   0
    .quad   0
    .quad   0
    .quad   0
    .quad   0
    .long   72
    .long   5

# ...

# __swift_FORCE_LOAD_ of linked libraries

__swift_FORCE_LOAD_$_swiftCoreGraphics_$_obj:
    .quad   __swift_FORCE_LOAD_$_swiftCoreGraphics

    .section    __TEXT,__objc_methname,cstring_literals
"L_selector_data(isEqual:)":
    .asciz  "isEqual:"

    .section    __TEXT,__cstring,cstring_literals
L___unnamed_4:
    .asciz  "c24@0:8@16"

L___unnamed_5:
    .asciz  "hash"

L___unnamed_6:
    .asciz  "Tq,N,R"

    .section    __TEXT,__objc_methname,cstring_literals
"L_selector_data(hash)":
    .asciz  "hash"

    .section    __TEXT,__cstring,cstring_literals
L___unnamed_7:
    .asciz  "q16@0:8"

L___unnamed_8:
    .asciz  "superclass"

L___unnamed_9:
    .asciz  "T#,N,R"

    .section    __TEXT,__objc_methname,cstring_literals
"L_selector_data(superclass)":
    .asciz  "superclass"

    .section    __TEXT,__cstring,cstring_literals
L___unnamed_10:
    .asciz  "#16@0:8"

    .section    __TEXT,__objc_methname,cstring_literals
"L_selector_data(class)":
    .asciz  "class"

"L_selector_data(self)":
    .asciz  "self"

    .section    __TEXT,__cstring,cstring_literals
L___unnamed_11:
    .asciz  "@16@0:8"

    .section    __TEXT,__objc_methname,cstring_literals
"L_selector_data(performSelector:)":
    .asciz  "performSelector:"

    .section    __TEXT,__cstring,cstring_literals
L___unnamed_12:
    .asciz  "^@24@0:8:16"

    .section    __TEXT,__objc_methname,cstring_literals
"L_selector_data(performSelector:withObject:)":
    .asciz  "performSelector:withObject:"

    .section    __TEXT,__cstring,cstring_literals
L___unnamed_13:
    .asciz  "^@32@0:8:16@24"

    .section    __TEXT,__objc_methname,cstring_literals
"L_selector_data(performSelector:withObject:withObject:)":
    .asciz  "performSelector:withObject:withObject:"

    .section    __TEXT,__cstring,cstring_literals
    .align  4
L___unnamed_14:
    .asciz  "^@40@0:8:16@24@32"

    .section    __TEXT,__objc_methname,cstring_literals
"L_selector_data(isProxy)":
    .asciz  "isProxy"

    .section    __TEXT,__cstring,cstring_literals
L___unnamed_15:
    .asciz  "c16@0:8"

    .section    __TEXT,__objc_methname,cstring_literals
"L_selector_data(isKindOfClass:)":
    .asciz  "isKindOfClass:"

    .section    __TEXT,__cstring,cstring_literals
L___unnamed_16:
    .asciz  "c24@0:8#16"

    .section    __TEXT,__objc_methname,cstring_literals
"L_selector_data(isMemberOfClass:)":
    .asciz  "isMemberOfClass:"

"L_selector_data(conformsToProtocol:)":
    .asciz  "conformsToProtocol:"

    .section    __TEXT,__cstring,cstring_literals
    .align  4
L___unnamed_17:
    .asciz  "c24@0:8@\"Protocol\"16"

    .section    __TEXT,__objc_methname,cstring_literals
"L_selector_data(respondsToSelector:)":
    .asciz  "respondsToSelector:"

    .section    __TEXT,__cstring,cstring_literals
L___unnamed_18:
    .asciz  "c24@0:8:16"

    .section    __TEXT,__objc_methname,cstring_literals
"L_selector_data(retain)":
    .asciz  "retain"

"L_selector_data(release)":
    .asciz  "release"

    .section    __TEXT,__cstring,cstring_literals
L___unnamed_19:
    .asciz  "v16@0:8"

    .section    __TEXT,__objc_methname,cstring_literals
"L_selector_data(autorelease)":
    .asciz  "autorelease"

"L_selector_data(retainCount)":
    .asciz  "retainCount"

"L_selector_data(zone)":
    .asciz  "zone"

    .section    __TEXT,__cstring,cstring_literals
L___unnamed_20:
    .asciz  "^v16@0:8"

L___unnamed_21:
    .asciz  "description"

    .align  4
L___unnamed_22:
    .asciz  "T@\"NSString\",N,R"

    .section    __TEXT,__objc_methname,cstring_literals
"L_selector_data(description)":
    .asciz  "description"

    .section    __TEXT,__cstring,cstring_literals
    .align  4
L___unnamed_23:
    .asciz  "@\"NSString\"16@0:8"

    .align  4
L___unnamed_24:
    .asciz  "debugDescription"

    .section    __TEXT,__objc_methname,cstring_literals
"L_selector_data(debugDescription)":
    .asciz  "debugDescription"

    .section    __TEXT,__cstring,cstring_literals
L___unnamed_2:
    .asciz  "NSObject"

    .section    __DATA,__objc_const
    .align  3
l__PROTOCOL_INSTANCE_METHODS_NSObject:
    .long   24
    .long   19
    .quad   "L_selector_data(isEqual:)"
    .quad   L___unnamed_4
    .quad   0
    .quad   "L_selector_data(hash)"
    .quad   L___unnamed_7
    .quad   0
    .quad   "L_selector_data(superclass)"
    .quad   L___unnamed_10
    .quad   0
    .quad   "L_selector_data(class)"
    .quad   L___unnamed_10
    .quad   0
    .quad   "L_selector_data(self)"
    .quad   L___unnamed_11
    .quad   0
    .quad   "L_selector_data(performSelector:)"
    .quad   L___unnamed_12
    .quad   0
    .quad   "L_selector_data(performSelector:withObject:)"
    .quad   L___unnamed_13
    .quad   0
    .quad   "L_selector_data(performSelector:withObject:withObject:)"
    .quad   L___unnamed_14
    .quad   0
    .quad   "L_selector_data(isProxy)"
    .quad   L___unnamed_15
    .quad   0
    .quad   "L_selector_data(isKindOfClass:)"
    .quad   L___unnamed_16
    .quad   0
    .quad   "L_selector_data(isMemberOfClass:)"
    .quad   L___unnamed_16
    .quad   0
    .quad   "L_selector_data(conformsToProtocol:)"
    .quad   L___unnamed_4
    .quad   0
    .quad   "L_selector_data(respondsToSelector:)"
    .quad   L___unnamed_18
    .quad   0
    .quad   "L_selector_data(retain)"
    .quad   L___unnamed_11
    .quad   0
    .quad   "L_selector_data(release)"
    .quad   L___unnamed_19
    .quad   0
    .quad   "L_selector_data(autorelease)"
    .quad   L___unnamed_11
    .quad   0
    .quad   "L_selector_data(retainCount)"
    .quad   L___unnamed_7
    .quad   0
    .quad   "L_selector_data(zone)"
    .quad   L___unnamed_20
    .quad   0
    .quad   "L_selector_data(description)"
    .quad   L___unnamed_11
    .quad   0

    .align  3
l__PROTOCOL_INSTANCE_METHODS_OPT_NSObject:
    .long   24
    .long   1
    .quad   "L_selector_data(debugDescription)"
    .quad   L___unnamed_11
    .quad   0

    .align  3
l__PROTOCOL_PROPERTIES_NSObject:
    .long   16
    .long   4
    .quad   L___unnamed_5
    .quad   L___unnamed_6
    .quad   L___unnamed_8
    .quad   L___unnamed_9
    .quad   L___unnamed_21
    .quad   L___unnamed_22
    .quad   L___unnamed_24
    .quad   L___unnamed_22

    .align  3
l__PROTOCOL_METHOD_TYPES_NSObject:
    .quad   L___unnamed_4
    .quad   L___unnamed_7
    .quad   L___unnamed_10
    .quad   L___unnamed_10
    .quad   L___unnamed_11
    .quad   L___unnamed_12
    .quad   L___unnamed_13
    .quad   L___unnamed_14
    .quad   L___unnamed_15
    .quad   L___unnamed_16
    .quad   L___unnamed_16
    .quad   L___unnamed_17
    .quad   L___unnamed_18
    .quad   L___unnamed_11
    .quad   L___unnamed_19
    .quad   L___unnamed_11
    .quad   L___unnamed_7
    .quad   L___unnamed_20
    .quad   L___unnamed_23
    .quad   L___unnamed_23

    .no_dead_strip  __TMp3obj10MyProtocol

当声明协议@objc时,这些符号没有加载,我认为这项工作被转移到Swift模块的目标-C头。

MyApp-Swift.h

代码语言:javascript
运行
复制
SWIFT_PROTOCOL("_TtP15MyApp12SomeProtocol_")
@protocol SomeProtocol
@end

每个协议这里的生成程序集之间的完全不同。

票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37443212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档