Til*_*ütz 12 objective-c clang objective-c-runtime
我试图将我的一些Objective-C项目从GCC切换到Linux上的Clang.我使用了GCC 4.6.2运行时,因为Clang编译器没有附带一个.编译和链接工作,但使用protocol_*方法时,它们不起作用.
以下示例适用于GCC,但与Clang不符合预期:
#include <objc/runtime.h>
#include <stdio.h>
@protocol MyProtocol
+ aClassMethod;
- anInstanceMethod;
@end
void doIt(Protocol *p, SEL sel)
{
printf("the protocol: %p\n", p);
if (!p) return;
printf("the protocol's name: %s\n", protocol_getName(p));
struct objc_method_description d = protocol_getMethodDescription(p, sel, YES, YES);
printf("required: YES instance: YES ? %p\n", d.name);
d = protocol_getMethodDescription(p, sel, YES, NO);
printf("required: YES instance: NO ? %p\n", d.name);
d = protocol_getMethodDescription(p, sel, NO, YES);
printf("required: NO instance: YES ? %p\n", d.name);
d = protocol_getMethodDescription(p, sel, NO, NO);
printf("required: NO instance: NO ? %p\n", d.name);
}
int main(int argc, char **argv)
{
Protocol *p1 = @protocol(MyProtocol);
printf("P1\n");
printf("class method first:\n");
doIt(p1, @selector(aClassMethod));
printf("instance method follows:\n");
doIt(p1, @selector(anInstanceMethod));
Protocol *p2 = objc_getProtocol("MyProtocol");
printf("P2\n");
printf("class method first:\n");
doIt(p2, @selector(aClassMethod));
printf("instance method follows:\n");
doIt(p2, @selector(anInstanceMethod));
printf("done\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
海湾合作委员会编制方案的预期产出:
P1
class method first:
the protocol: 0x804a06c
the protocol's name: MyProtocol
required: YES instance: YES ? (nil)
required: YES instance: NO ? 0x804b530
required: NO instance: YES ? (nil)
required: NO instance: NO ? (nil)
instance method follows:
the protocol: 0x804a06c
the protocol's name: MyProtocol
required: YES instance: YES ? 0x804b528
required: YES instance: NO ? (nil)
required: NO instance: YES ? (nil)
required: NO instance: NO ? (nil)
P2
class method first:
the protocol: 0x804a06c
the protocol's name: MyProtocol
required: YES instance: YES ? (nil)
required: YES instance: NO ? 0x804b530
required: NO instance: YES ? (nil)
required: NO instance: NO ? (nil)
instance method follows:
the protocol: 0x804a06c
the protocol's name: MyProtocol
required: YES instance: YES ? 0x804b528
required: YES instance: NO ? (nil)
required: NO instance: YES ? (nil)
required: NO instance: NO ? (nil)
done
Run Code Online (Sandbox Code Playgroud)
Clang编译程序的意外输出:
P1
class method first:
the protocol: 0x804a050
the protocol's name: (null)
required: YES instance: YES ? (nil)
required: YES instance: NO ? (nil)
required: NO instance: YES ? (nil)
required: NO instance: NO ? (nil)
instance method follows:
the protocol: 0x804a050
the protocol's name: (null)
required: YES instance: YES ? (nil)
required: YES instance: NO ? (nil)
required: NO instance: YES ? (nil)
required: NO instance: NO ? (nil)
P2
class method first:
the protocol: (nil)
instance method follows:
the protocol: (nil)
done
Run Code Online (Sandbox Code Playgroud)
这有什么不对?是否有一些神奇的初始化代码在使用Clang时不会被调用?
[更新]
添加协议的实现时,如下所示,该objc_getProtocol()方法可行,但protocol_*方法仍然没有.
@interface MyInstance <MyProtocol>
@end
@implementation MyInstance
+ aClassMethod
{
return nil;
}
- anInstanceMethod
{
return nil;
}
@end
Run Code Online (Sandbox Code Playgroud)
在我的测试中,GCC 与其包含的 GNU libobjc 配合得很好,但 Clang 与 GNUstep libobjc2 配合得更好。
\n\nGCC 4.6 w/ 包含 GNU libobjc:通过
\n\n\nP1\n第一个类方法:\n协议:0x602120\n协议名称:MyProtocol\n必需:YES 实例:YES \xe2\x86\x92 (nil)\n必需:YES 实例:NO \xe2\x86\x92 0x10eda50\n必需: NO 实例: YES \xe2\x86\x92 (nil)\n必需: NO 实例: NO \xe2\x86\x92 (nil)\实例方法如下:\n协议: 0x602120\n协议名称: MyProtocol\n必需: YES实例:是 \xe2\x86\x92 0x10eda40\n必需:是 实例:否 \xe2\x86\x92(无)\n必需:否 实例:是 \xe2\x86\x92(无)\n必需:否 实例:否 \ xe2\x86\x92 (nil)\nP2\n第一个类方法:\n协议: 0x602120\n协议名称: MyProtocol\n必需: YES 实例: YES \xe2\x86\x92 (nil)\n必需: YES 实例: NO \ xe2\x86\x92 0x10eda50\n必需:NO 实例:YES \xe2\x86\x92 (nil)\n必需:NO 实例:NO \xe2\x86\x92 (nil)\n实例方法如下:\n协议:0x602120\n协议名称:MyProtocol\n必需:YES 实例:YES \xe2\x86\x92 0x10eda40\n必需:YES 实例:NO \xe2\x86\x92 (nil)\n必需:NO 实例:YES \xe2\x86\x92 (nil) \n必需:无实例:NO \xe2\x86\x92 (nil)\ndone\n\n\n
GCC 4.6 w/ libobjc2 1.6:失败
\n\n\nP1\n类方法第一个:\n协议:0x602120\n协议名称:MyProtocol\n必需:YES 实例:YES \xe2\x86\x92 (nil)\n必需:YES 实例:NO \xe2\x86\x92 0x6020a0\n必需: NO 实例: YES \xe2\x86\x92 (nil)\n必需: NO 实例: NO \xe2\x86\x92 (nil)\实例方法如下:\n协议: 0x602120\n协议名称: MyProtocol\n必需: YES实例:是 \xe2\x86\x92 0x6020b0\n必需:是 实例:否 \xe2\x86\x92(无)\n必需:否 实例:是 \xe2\x86\x92(无)\n必需:否 实例:否 \ xe2\x86\x92 (nil)\nP2\n第一个类方法:\n协议:(nil)\实例方法如下:\n协议:(nil)\ndone\n\n\n
Clang 3.1 w/ GCC 4.6 GNU libobjc:失败
\n\n\nP1\n第一个类方法:\n协议:0x602080\n协议名称:(空)\n必需:YES 实例:YES \xe2\x86\x92 (nil)\n必需:YES 实例:NO \xe2\x86\x92 ( nil)\n必需: NO 实例: YES \xe2\x86\x92 (nil)\n必需: NO 实例: NO \xe2\x86\x92 (nil)\n实例方法如下:\n协议: 0x602080\n协议名称: ( null)\n必需:YES 实例:YES \xe2\x86\x92 (nil)\n必需:YES 实例:NO \xe2\x86\x92 (nil)\n必需:NO 实例:YES \xe2\x86\x92 (nil) \n必需:无实例:NO \xe2\x86\x92 (nil)\nP2\n第一个类方法:\n协议:(nil)\实例方法如下:\n协议:(nil)\ndone\n\n\n
Clang 3.1 带 libobjc2 1.6:通过
\n\n\nP1\n类方法第一个:\n协议:0x602080\n协议名称:MyProtocol\n必需:YES 实例:YES \xe2\x86\x92 (nil)\n必需:YES 实例:NO \xe2\x86\x92 (nil) \n必需:NO 实例:YES \xe2\x86\x92 (nil)\n必需:NO 实例:NO \xe2\x86\x92 (nil)\n实例方法如下:\n协议:0x602080\n协议名称:MyProtocol\n必需: YES 实例: YES \xe2\x86\x92 (nil)\n必需: YES 实例: NO \xe2\x86\x92 (nil)\n必需: NO 实例: YES \xe2\x86\x92 (nil)\n必需: NO实例:NO \xe2\x86\x92 (nil)\nP2\n第一个类方法:\n协议:0x602080\n协议名称:MyProtocol\n必需:YES 实例:YES \xe2\x86\x92 (nil)\n必需:YES实例:NO \xe2\x86\x92 (nil)\n必需:NO 实例:YES \xe2\x86\x92 (nil)\n必需:NO 实例:NO \xe2\x86\x92 (nil)\实例方法如下:\协议: 0x602080\n协议名称: MyProtocol\n必需: YES 实例: YES \xe2\x86\x92 (nil)\n必需: YES 实例: NO \xe2\x86\x92 (nil)\n必需: NO 实例: YES \ xe2\x86\x92 (nil)\n必需:无实例:NO \xe2\x86\x92 (nil)\ndone\n\n
| 归档时间: |
|
| 查看次数: |
481 次 |
| 最近记录: |