【发布时间】:2011-07-09 05:43:52
【问题描述】:
简介
所以我一直在试验 <objc/runtime.h 中定义的 Objective-C 低级运行时 API,并遵循 Apple's documentation。你可以看到我玩in this gist的结果。
问题
我已经能够通过 Objective-C 仅通过低级运行时 API 和 C 动态创建一个简单的 Hello World(请参阅上面的要点)。有用。现在我正在尝试使用相同的技术动态创建NSMutableArray。这是代码的sn-p:
Class nsmutablearray = objc_getClass("NSMutableArray");
id array = class_createInstance(nsmutablearray, 0);
id arrayAfterInit = objc_msgSend(array, sel_registerName("init"));
// get the count
objc_msgSend(arrayAfterInit, sel_registerName("count"))
但它给了我一个错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSArray count]: method only defined for abstract class. Define -[NSMutableArray count]!'
但如果我将上面的 sn-p 的中间部分更改为:
id arrayAfterInit = objc_msgSend(nsmutablearray, sel_registerName("arrayWithCapacity:"), 10);
这让我有点困惑,因为它们应该是等价的。第一个 sn-p 应该等效于调用 [[NSMutableArray alloc] init] ,它作为 Objective-C 语法工作,但在调用这些 C 函数时不是。
对此的任何启示将不胜感激。提前致谢!
【问题讨论】:
标签: reflection nsmutablearray objective-c-runtime