2013-03-23 3 views
6

Chcę skonstruować prosty program Celu C bez Fundacji. Próbowałem:Jak przydzielić nowy obiekt bez Fundacji?

#include <stdio.h> 

@interface Foo{ 
    char * bar; 
} 
-(void)hello; 
@end 

@implementation Foo 
-(void)hello { 
    printf("Hello world!"); 
} 
@end 

int main(){ 
    Foo * foo = [Foo alloc]; 
    return 0; 
} 

Potem mówi mi Foo may not respond to +alloc i autorelease called without pool ...

Jak mogę zainicjować obiektu bez użycia alloc od Fundacji?

+2

Dlaczego nie chcesz używać Fundacji? – occulus

+0

@occulus Ponieważ chcę używać Celu C jako alternatywy dla C++ i nie używam Mac OSa – texasbruce

+2

@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

Odpowiedz

9

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!

+0

Zajrzałem do runtime.h, i znalazłem: aby zniszczyć obiekt, użyj 'object_dispose (obj)' na wypadek, gdyby ktoś pytał. – texasbruce

+0

Dobrze zapamiętany, @texasbruce. – LuisABOL

1
+0

Próbowałem pierwszy z 'Object.h', ale nadal mówi mi, że metoda alloc nie jest zdefiniowana ... Chyba muszę użyć NSObject następnie – texasbruce

0

Nie określić Alloc, bo nie dziedziczyć NSObject który jest częścią fundacji.

Tutaj przypadki są dwa:

  1. Myślisz, że fundament jest zła, lub z jakiegoś powodu nie można go używać.
  2. Robisz to dla ćwiczeń.

Jeśli nie jesteś w drugim przypadku, a nie w jakimś szczególnym przypadku, który czyni podstawę niemożliwym do użycia, ponownie rozważyłbym twój wybór.

Jeśli jednak nie chcesz używać fundamentu, alloc powinien zwrócić obiekt z zainicjalizowanym wskaźnikiem isa.

+0

Upewnij się również, że podjąłeś wskaźnik tag i małe obiekty dla swojego niestandardowy przydział. Lepiej używać tego, co daje ci Twoje środowisko uruchomieniowe. Nie jest konieczne, aby obiekty były eksponowane lub posiadały isa. –