Mik*_*e D 2 objective-c objective-c-runtime ios jsonkit
我注意到了对XCode(4.6)的最新更新,我收到了关于几行的警告JSONKit.m.特别是,设置对象类的行:
dictionary->isa = _JKDictionaryClass;
Run Code Online (Sandbox Code Playgroud)
这些标记为已弃用,并注明首选方法是使用object_setClass():
object_setClass(dictionary, _JKDictionaryClass);
Run Code Online (Sandbox Code Playgroud)
当我问为什么最好只是让警告静音时,回答是:
即使新的Xcode版本抱怨,一切都运行正常,我不想:
1)测试每个项目我使用JSONKit来检查在object_setClass()后是否一切正常
2)松散的cpu周期,这就是我使用JSONKit的原因以NSJSONSerialization为例.我当前的应用程序解析权重为600K-1M的json文件
我们在这里讨论了多少性能影响?
注意:
我更感兴趣
dictionary->isa = _JKDictionaryClass VS object_setClass()
比JSONKitVS NSJSONSerialization.
Gwy*_*ind 10
这个推理与性能打击无关,而且从来没有.将对象定义为具有isa指针是一个实现细节,并且至少从Objective-C 2.0开始(并且在概念上已经持续了很长时间).Clang编译器人员和Apple,特别是参与优化运行时的人员,除了能够将对象定义为具有最快的内部结构而不是始终维护该isa字段之外,没有比这更好的了.这样的事实isa存在,事实上,它存在于每一个对象的开始,那isa简直是一个Class指针,始终理论上受到改变.它没有改变到这一点,因为兼容性中断这样做会导致其他任何事情.
此外,object_setClass对比的性能特征object->isa = blah是一个笑话.在硬件级别,CPU很容易在函数调用影响代码之前很久就优化函数调用的开销.如果您担心所涉及的周期数pushq %rbp; movq %rsp, %rbp; movq %rsi, (%rdi); popq %rbp; ret,那么您不再处于Objective-C问题域中 - 如果您的代码对由五个指令制作的不同代码敏感,那么您应该已经在C语言或汇编语言级别工作.
除了所有这些之外,完全没有理由以这种方式设置对象的类.你为什么要这样做,这对你有什么帮助?
最后,我可以补充说,Clang团队有更好的事情要做,而不仅仅是为了处理这种"性能""问题"而添加警告.几乎所有的警告(不是全部,但大多数)意味着你做错了什么,即使它在你正在测试的情况下恰好工作.对于使用标记指针的任何对象,此代码已经中断.这就是Xcode试图告诉你的.
编辑:有人向我指出,问题不在于警告本身的原因,而在于相关功能的特定性能特征.正如我在回答中提到的,性能影响非常小,如果它与您的代码相关,那么您首先不应该使用Objective-C.我对误解原始问题表示歉意.
| 归档时间: |
|
| 查看次数: |
1396 次 |
| 最近记录: |