【问题标题】:reimplementing NSObject from scratch从头开始重新实现 NSObject
【发布时间】:2010-08-11 21:51:08
【问题描述】:

当我阅读新的 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: -- abort”

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

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

提前致谢。

更新

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

【问题讨论】:

  • 你可能想看看 NSObject 协议,如果你还没有:developer.apple.com/mac/library/documentation/Cocoa/Reference/…
  • 包含头文件不会解决来自链接器的缺失符号错误。您需要链接到 libobjc(通常由 Foundation 为您完成)。
  • 无论如何,您可能都不想使用sizeof(self) 获取大小。 self 是一个指针,所以你只会得到指针的大小。您可以改用class_getInstanceSize

标签: objective-c cocoa cocoa-touch macos nsobject


【解决方案1】:

正如 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

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    相关资源
    最近更新 更多