Ant*_*udt 13 macos cocoa cocoa-touch objective-c nsobject
当我阅读关于新的4.0.2 iOS更新时,我想知道黑客做了什么或尝试做缓冲区溢出,这是在一些维基百科让我对使用malloc感兴趣并因此创建我自己的"NSObject"之后.
我实际上并没有计划在我的任何应用程序中使用它,它只用于学习和使用objective-c.
当然,正如预期的那样,我遇到了一些我无法解决的问题.
为了创建我的对象我做:
+ (id)create{ return malloc(sizeof(self)); }
Run Code Online (Sandbox Code Playgroud)
和
- (void)free { free(self); }
Run Code Online (Sandbox Code Playgroud)
调用[TestObject create]时; 我收到以下控制台消息:
"8/11/10 11:17:31 PM TestingHeap [2675]***NSInvocation:警告:类'AObject'的对象0x100002100未实现doesNotRecognizeSelector: - abort"
所以它试图将我的对象作为NSObject处理..?以及如何解决这个问题.
另外,在没有Foundation或AppKit的情况下进行编译时,我会发现缺少符号的错误,特别是__objc_empty_vtable和__objc_empty_cache.我试过从/ usr/include/objc /中包含几个头文件
提前致谢.
更新
在与libobjc链接后,我尝试从我的类中调用方法时收到EXC_BAD_INSTRUCTION.
正如大卫指出的那样,你需要使用class_getInstanceSize而不是代替sizeof.
你需要链接libobjc(你自己发现).
您的基类需要一个isa必须在您的create方法中设置的指针.
并且运行时需要一个+initialize实现的方法,该方法将在第一次使用类之前调用.如果它丢失,它会崩溃.
所以基类的所有东西至少应该有:
#include <objc/objc.h>
#include <objc/runtime.h>
#include <stdlib.h>
@interface MyBase {
Class isa;
}
+ (id) alloc;
- (void) free;
@end
@implementation MyBase
+ (void) initialize;
{
}
+ (id) alloc;
{
size_t size = class_getInstanceSize( self );
MyBase *result = malloc( size );
result->isa = self;
return result;
}
- (void) free;
{
free( self );
}
@end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1099 次 |
| 最近记录: |