Utworzenie nowego obiektu bez użycia alloc
z Fundacji jest bardzo proste. Sama biblioteka środowiska wykonawczego Objective-C udostępnia funkcje, które pozwalają przydzielać obiekty z klas i deallocować je później, dzięki czemu nie potrzebujesz dodatkowej biblioteki do tworzenia i niszczenia obiektów.
Funkcja id class_createInstance(Class cls, size_t extraBytes)
odbiera obiekt klasy, z którego należy przydzielić nowy obiekt, oraz liczbę całkowitą, która jest prawie zawsze równa zeru, i zwraca nowe wystąpienie cls
.
Podobnie, funkcja id object_dispose(id obj)
pobiera obiekt Objective-C, wywołuje destruktor C++ każdej instancji obiektu C++, usuwa istniejące skojarzone odwołania i zwalnia je.
class_createInstance
i object_dispose
są zadeklarowane w /usr/include/objc/runtime.h
.
Dzięki temu można wdrożyć własne metody +alloc
i -dealloc
.Program będzie wyglądać następująco:
#include <stdio.h>
#include <objc/runtime.h>
@interface Foo{
char * bar;
}
+(id)alloc;
-(void)hello;
@end
@implementation Foo
+(id)alloc {
// Returns a new 'Foo' object. In this case, 'self' is a 'Foo' class object,
// whose type is 'Class', as required by `class_createInstance`.
return class_createInstance(self, 0);
}
-(void)dealloc {
object_dispose(self);
}
-(void)hello {
printf("Hello world!");
}
@end
int main(){
Foo *foo = [Foo alloc];
[foo hello];
[foo dealloc];
return 0;
}
skompilować go w normalny sposób:
gcc Foo.m -o Foo -lobjc
To wszystko!
Dlaczego nie chcesz używać Fundacji? – occulus
@occulus Ponieważ chcę używać Celu C jako alternatywy dla C++ i nie używam Mac OSa – texasbruce
@texasbruce Następnie użyj środowiska wykonawczego GNUStep. (Niezupełnie jest to praktyczny wybór platformy, ale byłoby lepiej niż próba ponownego wynalezienia 'NSObject'.) – millimoose