相关疑难解决方法(0)

Swift本机基类或NSObject

我测试了一些ISA混写有斯威夫特,以及时发现NSObject的是一个超类(直接或进一步上涨),或使用"@objc"的装饰,它才会起作用.否则它将遵循静态和vtable-dispatch样式,如C++.

没有Cocoa/NSObject基类定义Swift类是正常的吗?如果它是我关心的话,这意味着对Objective-C的大部分动力进行了描述,例如方法拦截和运行时内省.

动态运行时行为是属性观察者,核心数据,面向方面编程,高阶消息传递,分析和日志记录框架等功能的核心.

使用Objective-C的方法调用样式会在方法调用中添加大约20个机器代码操作数,因此在某些情况下(对具有小体的方法的许多严格调用)C++样式静态和vtable调度可以更好地执行.

但是考虑到一般的95-5规则(95%的性能增益来自调整5%的代码),从强大的动态功能开始并在必要时变硬是不是有意义的?

objective-c objective-c-runtime swift

101
推荐指数
3
解决办法
6万
查看次数

Objective-C中的消息发送成本

我很想知道在各种情况下Objective-C中的消息发送成本.特别是我想指导我选择的程序设计,所以我不想通过避免消息发送来过早优化,因为它们可以实现更好的设计.

我当前项目中的一个案例是我有一个带有实例变量的类:offsetX和offsetY.我经常想要绝对偏移量,目前我在这个地方都有这行代码: -

int absOffset = ((offsetX < 0.0) ? -offsetX : offsetX) + 
                 ((offsetY < 0.0) ? -offsetY : offsetY);
Run Code Online (Sandbox Code Playgroud)

现在,如果这是C++,我将创建一个返回absOffset值的内联函数.即使在Java/C#中,我也可以将这样的函数定义为final/sealed,并且非常确定它将被内联.

目标-C将是: -

-(int)absOffset {
    return ((offsetX < 0.0) ? -offsetX : offsetX) + 
            ((offsetY < 0.0) ? -offsetY : offsetY);
}
Run Code Online (Sandbox Code Playgroud)

我会这样称呼它: -

int ao = [self absOffset];
Run Code Online (Sandbox Code Playgroud)

现在,编译器能够内联吗?我假设它至少能够将它修复为直接函数调用并避免动态消息调度(我假设)objective-c必须使用因为它的类型系统.

另外,一般来说,客观C中的消息调度成本是多少?通过'id'调用指向具体类的指针时,它是否有所不同?

iphone objective-c

5
推荐指数
2
解决办法
3625
查看次数

标签 统计

objective-c ×2

iphone ×1

objective-c-runtime ×1

swift ×1