4

我是一个有点称职的红宝石程序员。昨天我决定最终尝试使用 Apple 的 Cocoa 框架。帮我看看 ObjC 的方式?

我正在努力解决objc_allocateClassPair问题objc_registerClassPair。我的目标是动态生成一些类,然后能够像使用任何其他类一样使用它们。这在 Obj C 中有效吗?

分配和注册类A后,调用时出现编译错误[[A alloc] init];(它说'A' Undeclared)。我只能A使用运行时的objc_getClass方法进行实例化。有什么方法可以告诉编译器A并像我一样传递消息NSString吗?编译器标志或什么?

我有 10 个左右的其他类 ( B, C, ...),它们都具有相同的超类。我想[A classMethod][B classMethod]不需要objc_getClass. 我是想在这里过于活跃还是只是搞砸了我的实施?它看起来像这样……</p>

 NSString *name = @"test";  
 Class newClass = objc_allocateClassPair([NSString class], [name UTF8String], 0);  
 objc_registerClassPair(newClass);  

 id a = [[objc_getClass("A") alloc] init];  
 NSLog(@"new class: %@ superclass: %@", a, [a superclass]);  
 //[[A alloc] init]; blows up.
4

4 回答 4

5

爆炸的原因[[A alloc] init];是编译器不知道是什么A意思。编译器永远不知道它A的存在。

编辑:另外,看起来你想要的是:

@interface A : NSObject {
  NSString *myString;
}

- (id)initWithString:(NSString *)string;

- (void)doItToIt;

@end

也许

@interface NSString (MyPrivateExtension)

- (void)doItToIt;

@end
于 2010-03-15T13:45:52.490 回答
1

当您在 Objective-C 语言中定义一个类时,编译器会定义一个新类型。当您动态创建一个类时,编译器不知道该类型,因此您唯一的选择是使用该类作为 id,并动态发送消息给它。Ruby 是一种动态类型语言,在运行时定义类时可能使用与编译器相同的机制。

于 2010-05-28T16:07:16.423 回答
1

看看http://www.mikeash.com/pyblog/friday-qa-2010-11-6-creating-classes-at-runtime-in-objective-c.htmlhttps://github.com/ mikeash/MAObjCRuntime

它描述了您想要实现的目标,并提供了对原始 Objective-C 运行时调用的良好抽象。

于 2013-11-21T12:35:45.353 回答
0

看看神话般的F-ScriptFSClass可以做到这一点并且是开源的。FSClass 定义了一个可以在运行时被子类化的元类。

它通过使用objc_allocateClassPairobjc_registerClassPair确实有效,但是还有很多其他的事情(除了我!)可能会有所帮助。

于 2010-05-28T16:48:35.207 回答