gpt4 book ai didi

objective-c - 从头开始重新实现 NSObject

转载 作者:太空狗 更新时间:2023-10-30 03:20:41 26 4
gpt4 key购买 nike

当我阅读新的 4.0.2 iOS 更新时,我想知道黑客对缓冲区溢出做了什么或尝试做什么,经过一些维基百科的搜索让我对玩 malloc 产生了兴趣,从而创建了我自己的“NSObject” ".

我实际上并不打算在我的任何应用程序中使用它,它只是为了学习和玩弄 objective-c。

当然,不出所料,我遇到了一些我自己无法解决的问题。

为了创建我的对象,我这样做:

+ (id)create{ return malloc(sizeof(self)); }

- (void)free { free(self); }

调用[TestObject create]时;我收到以下控制台消息:

“8/11/10 11:17:31 PM TestingHeap[2675] *** NSInvocation:警告:类‘AObject’的对象 0x100002100 未实现 doesNotRecognizeSelector:--中止”

所以它试图将我的对象作为 NSObject.. 处理?以及如何解决这个问题。

另外,在没有 Foundation 或 AppKit 的情况下进行编译时,我会收到缺少符号的错误消息,特别是 __objc_empty_vtable 和 __objc_empty_cache。我试过从/usr/include/objc/中包含几个头文件

提前致谢。

更新

与 libobjc 链接后,我在尝试从我的类中调用方法时收到 EXC_BAD_INSTRUCTION。

最佳答案

正如 David 指出的那样,您需要使用 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

关于objective-c - 从头开始重新实现 NSObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3463139/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com