1

所以我有这段代码......

/**
 * cdb.m
 * Copyright (C) 2013 Naveen Mathew. All rights reserved.
 */

#import <objc/Object.h>
#import "cdb.h"
#import <stdio.h>
#import <stdlib.h>

@implementation CDB : Object
{

}

- (int) main {
    printf("Hello world");
    return 0;
}

@end

int main(void)
{
    CDB *myNumber = [CDB new]; // equal to [[Number alloc] init]
    [myNumber main];

    return 0;
}

我想在 Ubuntu 13.04 中编译它,但没有 GNUStep 给我的所有废话。所以我使用 GNU Objective C 运行时(gobjc)但是当我编译时我得到以下......

clang -Wall -lobjc -o cdb cdb.m -I/usr/lib/gcc/x86_64-linux-gnu/4.7/include
cdb.m:25:21: warning: class method '+new' not found (return type defaults to
      'id') [-Wobjc-method-access]
        CDB *myNumber = [CDB new]; // equal to [[Number alloc] init]
                        ^    ~~~
1 warning generated.

当我运行程序时,我遇到了分段错误......我使用的是 gobjc 4.7。我用 gobjc 4.6 尝试过...它可以编译,但我仍然遇到分段错误...

4

2 回答 2

3

我认为一些古老的运行时已经实现了 +new 和 friends。对于像 gnustep-runtime 这样的较新的运行时,包括一个非常不同的 GCC 附带的,我认为,您必须使用类别或其他方式实现自己的胡扯。您可以只剪切和粘贴 GNUstep 的 NSObject 实现,但这对您来说可能太棘手了,因为它会在 malloc 前加上 retain counter 等,否则您可能想要实现自己的方式来维护引用计数,例如使用哈希映射或任何事物。如果单独使用 GNUstep-base 对您来说太多废话,您也可以尝试像 ObjFW 这样的替代框架。

于 2013-08-04T16:31:39.907 回答
2

+(id)new 是 NSObject 类的一个函数。但是,您正在对运行时对象进行子类化。要使用您习惯在 OS X 中使用的大多数 Apple 方法,您需要将 NSObject 子类化。

此外,您在接口中声明对象的超类,而不是在实现中。您需要更改@implementation CDB : NSObject@implementation CDB,然后,在您的头文件中,放置@interface CDB : NSObject { ...

于 2013-08-04T00:00:20.303 回答