3

我正在 Windows(cygwin、gcc)上测试一些简单的 Objective-C 代码。此代码已在 Mac 上的 Xcode 中运行。我想将我的对象转换为不是 NSObject 的子类(或其他任何东西,哈哈)。这可能吗,怎么做?

到目前为止我所拥有的:

// MyObject.h
@interface MyObject

- (void)myMethod:(int) param;

@end

// MyObject.m
#include "MyObject.h"

@interface MyObject()
{ // this line is a syntax error, why?
    int _field;
}
@end

@implementation MyObject

- (id)init {
  // what goes in here?
    return self;
}

- (void)myMethod:(int) param {
  _field = param;
}

@end

当我尝试编译它时会发生什么:

gcc -o test MyObject.m -lobjc
MyObject.m:4:1: error: expected identifier or ‘(’ before ‘{’ token
MyObject.m: In function ‘-[MyObject myMethod:]’:
MyObject.m:17:3: error: ‘_field’ undeclared (first use in this function)

编辑我的编译器是 cygwin 的 gcc,也有 cygwin gcc-objc 包:

gcc --version
gcc (GCC) 4.7.3

我已经尝试在网上和一些 Objective-C 教程中寻找这个,但是我发现的每个类的示例都继承自 NSObject。如果没有 Cocoa 或提供 NSObject 的某种 Cocoa 替代品,真的不可能编写 Objective-C 吗?

(是的,我知道 GNUstep。如果可能的话,我真的宁愿避免这种情况......)

编辑这有效:

// MyObject.h
@interface MyObject
@end
// MyObject.m
#include "MyObject.h"
@implementation MyObject
@end

虽然不是很有用...

4

2 回答 2

2

可以在没有基类的情况下创建类。有几件事正在发生。首先,您的编译器似乎不喜欢“()”类扩展语法。其他编译器也可以。如果您在 MyObject.m 的第四行删除那些“()”,那么您的编译器会抱怨您有两个重复的 MyObject 类接口。出于测试的目的,您应该将该_field变量移动到头文件中 MyObject 的声明中,例如:

@interface MyObject {
    int _field;
}
-(void)myMethod:(int)param;
@end

然后,您可以完全删除 .m 文件中的那个额外的@interface。这至少应该让你开始。

于 2013-10-20T03:47:27.437 回答
2

这是可能的,但请注意NSObject在objective-c 中实现内存分配API,如果您没有在根类上实现NSObject's+alloc-dealloc或等效项,您仍然需要为每个类实现相同的功能。

于 2013-10-25T19:24:51.343 回答