Когда я читал о новом обновлении 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 при попытке вызвать метод из моего класса.
Вам нужно использовать 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