переопределение NSObject с нуля

Когда я читал о новом обновлении iOS 4.0.2, я хотел знать, что делают хакеры или пытаются сделать с переполнением буфера, которое после некоторой википедии ' Я заинтересовался игрой с malloc и, таким образом, создавал свой собственный «NSObject».

На самом деле я не планирую использовать это ни в одном из моих приложений, он предназначен только для обучения и игры с target-c.

И конечно, как и ожидалось, я столкнулся с некоторыми проблемами, которые сам не смог решить.

для создания своего объекта я делаю:

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

и

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

при вызове [TestObject create]; Я получаю следующие консольные сообщения:

"11.08.10 23:17:31 TestingHeap [2675] *** NSInvocation: предупреждение: объект 0x100002100 класса 'AObject' не реализует doesNotRecognizeSelector: - abort"

То есть он пытается обработать мой объект как объект NSObject? и как мне это решить.

Кроме того, при компиляции без Foundation или AppKit, я получаю ошибку за отсутствующие символы,

На самом деле я не планирую использовать это ни в одном из своих приложений, оно предназначено только для обучения и игры с целью-C.

И, конечно, как и ожидалось, я столкнулся с некоторыми проблемами, которые сам не мог решить.

для создания моего объекта я делаю:

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

и

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

при вызове [TestObject create]; Я получаю следующие консольные сообщения:

"11.08.10 23:17:31 TestingHeap [2675] *** NSInvocation: предупреждение: объект 0x100002100 класса 'AObject' не реализует doesNotRecognizeSelector: - abort"

То есть он пытается обработать мой объект как объект NSObject? и как мне это решить.

Кроме того, при компиляции без Foundation или AppKit, я получаю ошибку за отсутствующие символы,

На самом деле я не планирую использовать это ни в одном из своих приложений, оно предназначено только для обучения и игры с целью-C.

И, конечно, как и ожидалось, я столкнулся с некоторыми проблемами, которые сам не мог решить.

для создания моего объекта я делаю:

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

и

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

при вызове [TestObject create]; Я получаю следующие консольные сообщения:

"11.08.10 23:17:31 TestingHeap [2675] *** NSInvocation: предупреждение: объект 0x100002100 класса 'AObject' не реализует doesNotRecognizeSelector: - abort"

То есть он пытается обработать мой объект как объект NSObject? и как мне это решить.

Кроме того, при компиляции без Foundation или AppKit, я получаю ошибку за отсутствующие символы, как и ожидалось, я столкнулся с некоторыми проблемами, которые сам не смог решить.

для создания своего объекта я делаю:

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

и

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

при вызове [TestObject create]; Я получаю следующие консольные сообщения:

"11.08.10 23:17:31 TestingHeap [2675] *** NSInvocation: предупреждение: объект 0x100002100 класса 'AObject' не реализует doesNotRecognizeSelector: - abort"

То есть он пытается обработать мой объект как объект NSObject? и как мне это решить.

Кроме того, при компиляции без Foundation или AppKit, я получаю ошибку за отсутствующие символы, как и ожидалось, я столкнулся с некоторыми проблемами, которые сам не смог решить.

для создания своего объекта я делаю:

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

и

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

при вызове [TestObject create]; Я получаю следующие консольные сообщения:

"11.08.10 23:17:31 TestingHeap [2675] *** NSInvocation: предупреждение: объект 0x100002100 класса 'AObject' не реализует doesNotRecognizeSelector: - abort"

То есть он пытается обработать мой объект как объект NSObject? и как мне это решить.

Кроме того, при компиляции без Foundation или AppKit, я получаю ошибку за отсутствующие символы, __objc_empty_vtable и __objc_empty_cache, в частности. Я попытался включить несколько файлов заголовков из / usr / include / objc /

Заранее спасибо.

Обновление

После связывания с libobjc я получаю EXC_BAD_INSTRUCTION при попытке вызвать метод из моего класса.

13
задан Antwan van Houdt 12 August 2010 в 11:36
поделиться

1 ответ

Вам нужно использовать 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
9
ответ дан 2 December 2019 в 01:30
поделиться