È molto semplice creare un nuovo oggetto senza utilizzare alloc
da Foundation. La libreria runtime Objective-C fornisce di per sé funzioni che consentono di allocare oggetti da classi e deallocarli in seguito, in modo da non aver bisogno di librerie aggiuntive per creare e distruggere oggetti.
La funzione id class_createInstance(Class cls, size_t extraBytes)
riceve un oggetto di classe, da cui allocare un nuovo oggetto e un numero intero, che è quasi sempre zero, e restituisce una nuova istanza di cls
.
Analogamente, la funzione id object_dispose(id obj)
accetta un oggetto Objective-C, chiama il distruttore C++ di ogni variabile di istanza dell'oggetto C++, rimuove i riferimenti associati esistenti e lo libera.
class_createInstance
e object_dispose
sono entrambi dichiarati in /usr/include/objc/runtime.h
.
Quindi, è possibile implementare i propri metodi +alloc
e -dealloc
.Il tuo programma sarà simile a questa:
#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;
}
compilarlo come si fa normalmente:
gcc Foo.m -o Foo -lobjc
Questo è tutto!
Perché si desidera evitare l'utilizzo di Foundation? – occulus
@occulus Perché voglio utilizzare l'Objective C come alternativa a C++ e non sto eseguendo Mac OS – texasbruce
@texasbruce Quindi utilizzare il runtime di GNUStep. (Non è esattamente una scelta pratica di piattaforma, ma funzionerebbe meglio di provare a reinventare 'NSObject'.) – millimoose