无法在 x86_64 上使用 __objc_msg_forward

标签 c objective-c

无论我做什么,我都无法让 __objc_msg_forward 在 Linux 上的 x86_64 上工作。如果我用 -m32 编译它工作正常。我整理了这个简单的程序来演示。它应该打印 Crasho Barfo 两次。

#import <objc/Object.h>
#import <objc/objc-api.h>

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

@interface Object (Test)
-(id) doSomething:(id) anObject;
@end

typedef void *(*vafunc)(void *a1, void *a2, ...);
vafunc getvtest(void *s1);

int main(int argc, char *argv[])
{
  id o1;
  vafunc ptr;
  int na;


  ptr = getvtest(NULL);
  na = 4;
  (*ptr)(ptr, &na, "dog", "cat");

  __objc_msg_forward = getvtest;
  o1 = [[Object alloc] init];
  [o1 doSomething:o1];
  exit(0);
}

void *aptest(void *a1, void *a2, va_list ap)
{
  fprintf(stderr, "Barfo\n");
  return nil;
}

void *vtest(void *a1, void *a2, ...)
{
  va_list ap;
  void *ret = NULL;


  fprintf(stderr, "Crasho\n");
  va_start(ap, a2);
  ret = aptest(a1, a2, ap);
  va_end(ap);

  return ret;
}

vafunc getvtest(void *s1)
{
  return (vafunc) vtest;
}

我到底做错了什么?当我运行它时,会发生这种情况:

./vtest 
Crasho
Barfo
Segmentation fault

如果我在 gdb 中将其拉出,它会显示“非法指令”。

最佳答案

您使用谁的 64 位 Obj-C 运行时?据我所知,Apple 仅支持 x86_64 上的 Obj-C 2.0 运行时。

关于无法在 x86_64 上使用 __objc_msg_forward,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3481216/

相关文章:

C - 子进程连续从管道读取两次,而不是读取一次然后阻塞

C动态分配struct

objective-c - @synchronized(self) 是否创建一个 block ,其中 self 前缀在属性上是不必要的?

ios - 在iOS 6中获取真实的Twitter用户名

objective-c - NSString writeToFile 带有 URL 编码字符串

ios - didSelectItemAtIndexPath 方法在 UICollectionView 中不起作用

c - 难以从 C 中的 .txt 文件读取最后一条记录

c - 有没有办法到管道的最后位置而不是读取直到什么都没有?

c - 指向 C 中字符串的指针?

ios - 检测 AVPlayerViewController 完成按钮点击?