GNU运行时:class_createInstance返回从没有强制转换的整数生成指针

时间:2013-11-22 12:14:49

标签: objective-c gnu objective-c-runtime

我正在尝试在GNU运行时上创建一个新的Objective-C根类。以下是我到目前为止的情况:

foo.h中:

#include <objc/objc.h>

@interface Foo {
  Class isa;
  int bar;
}

+ (id) alloc;
+ (id) newWithBar: (int) bar;
- (id) initWithBar: (int) bar;
- (void) p;
- (void) dispose;

@end

foo.m:

#import <foo.h>
#include <stdio.h>

@implementation Foo

+ (id) alloc {
  return class_createInstance(self, 0);
}

+ (id) newWithBar: (int) bar {
  return [[self alloc] initWithBar: bar];
}

- (id) initWithBar: (int) bar_ {
  bar = bar_;
}

- (void) p {
  printf ("bar=%d\n", self->bar);
}

- (void) dispose {
  object_dispose(self);
}

@end

和一个小测试程序,main.m:

#import <foo.h>

int main(int argc, char *argv[]) {
  Foo *foo = [Foo newWithBar: 3];
  [foo p];
  [foo dispose];
  return 0;
}

当我编译foo.m时,我收到以下警告:

foo.m: In function ‘+[Foo alloc]’:
foo.m:7:3: warning: return makes pointer from integer without a cast [enabled by default]

为什么呢?当我深入研究头文件时,我可以看到class_createInstance返回id。我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

您需要包含目标C运行时的标头。编译器的默认行为是假设未声明的函数返回int。

#include <objc-auto.h>

抱歉 - 上面的答案适用于OS X / iOS。对于GNU,您需要包含runtime.h以及objc.h

#include <objc/runtime.h>