2012-04-11 3 views
3

neu in Objective-C,objectC Autorelease-Problem, was ist falsch mit Code?

#import <objc/objc.h> 
#import <Foundation/Foundation.h> 

@interface Test:NSObject 
{ 
    int x,y, abc; 
    NSString *v1, *v2; 
} 
@property int x , y, abc; 
-(void) print; 

@end 

@implementation Test 
@synthesize x,y, abc; 
-(void) print 
{ 
NSLog (@"v1 and v2 values %i, %i ", v1, v2); 
} 

@end 

int main (int argc, char **argv) 

{ 
    Test *t = [[Test alloc] init]; 
    /* Synthesized Set Method */ 
    [t setX:100]; 
    [t setY:200]; 
/* Synthesized Get Method */ 
    NSLog (@"Retrieving Values %i, %i ",[t x], [t y]); 

/* another Way to retrieve the throuhg KVC Model */ 
NSLog (@" KVC Retrieveal %i ", [t valueForKey:@"x"]); 

}

ich Zeitfehler nicht bekommen kompilieren, aber Zeitfehler ausführen ich habe:

2012-04-11 16:25:08.470 testpgm[22237] Retrieving Values 100, 200 
2012-04-11 16:25:08.513 testpgm[22237] autorelease called without pool for object (0x8e78ca0) of class NSMethodSignature in thread <NSThread: 0x8e23a08> 
2012-04-11 16:25:08.514 testpgm[22237] autorelease called without pool for object (0x8e94610) of class NSIntNumber in thread <NSThread: 0x8e23a08> 
2012-04-11 16:25:08.514 testpgm[22237] KVC Retrieveal 149505552 

Sieht aus wie es ist etwas mit dem zu tun Speicherproblem. Einige zeigen das Problem auf?

HINWEIS: Mit allen Eingängen, könnte ich das Autorelease Problem beheben, aber immer noch

NSLog (@" KVC Retrieveal %i ", [t valueForKey:@"x"]); 

nicht den richtigen Wert drucken, aber den Müll. Mache ich etwas falsch?

+0

Ihre überarbeitete Frage hat nichts funktioniert mit Ihrer ursprünglichen Frage zu tun. Aber die Antwort ist, dass die Formatzeichenfolge "% i" eine Ganzzahl angibt, während "valueForKey:" ein Objekt zurückgibt. – Chuck

Antwort

4

Wenn Sie in der Laufschleife eines sind Anwendung, es ist ein Standard-Autorelease-Pool für Sie erstellt. Wenn Sie jedoch mit Ihrer eigenen main arbeiten, müssen Sie einen Autorelease-Pool manuell am Anfang Ihrer main erstellen und regelmäßig leeren.

NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init]; 
// Your code that uses autorelease... 
[myPool drain]; 

Wenn Sie mit dem neuen LLVM Compiler kompilieren, verwenden Sie die neue @autoreleasepool Funktion statt.

+0

Danke für die Antwort, ich benutze GNUStep zum kompilieren in ubuntu und läuft. – Whoami

+1

'@ autoreleasepool' kann in allen Objective-C Modi verwendet werden, nicht nur ARC – beryllium

+0

Nun, ich habe hinzugefügt, wie Sie vorgeschlagen haben, jetzt bekomme ich nicht den Laufzeitfehler, aber NSLog (@" KVC Retrieveal% i ", [t valueForKey: @ "x"]); druckt keinen x-Wert, warum? – Whoami

5

Die Hauptroutine erstellt keinen Autorelease-Pool.

Verwenden Sie eine dieser Methoden abhängig von der Version und dem verwendeten Compiler.

Neuere oder mit ARC:

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 

    // your code 

    } 
} 

oder

int main(int argc, char *argv[]) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // your code 

    [pool drain]; 
} 

Der Code zahlreiche andere Probleme wie hat:

NSLog (@"v1 and v2 values %i, %i ", v1, v2); 

die sollte

NSLog (@"v1 and v2 values %@, %@ ", v1, v2); 

% @ wird zum Drucken von Objekten verwendet,% i für Ganzzahlen.

Die Linie:

NSLog (@" KVC Retrieveal %i ", [t valueForKey:@"x"]); 

ist interessant, weil ValueForKey ein Objekt zurückgibt (in diesem Fall ein NSNumber), so lautet die korrekte Aussage:

NSLog (@" KVC Retrieveal %@ ", [t valueForKey:@"x"]); 

Ausführen des Programms mit diesen Korrekturen erzeugt:

Retrieving Values 100, 200 
KVC Retrieveal 100 
1

main Funktion muss einen Autorelease-Pool haben.

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 

     // you code 

     return ...; 
    } 
} 

EDIT:
Bezüglich Ihrer zweiten Teil der Frage. valueForKey kehrt id, warf es zu int

NSLog (@" KVC Retrieveal %i ", [[t valueForKey:@"x"] intValue]); 
+0

@Whoami, siehe meine aktualisierte Antwort – beryllium

+1

Dies ist kein Cast, es ist ein Methodenaufruf für das zurückgegebene Objekt, das eine ganze Zahl zurückgibt. – zaph

+0

Ja, ich sage es aus Bequemlichkeit. – beryllium

0
int main (int argc, char **argv) 

{ 
NSAutoreleasePool *myPool = [NSAutoreleasePool new]; 
    Test *t = [[Test alloc] init]; 
    /* Synthesized Set Method */ 
    [t setX:100]; 
    [t setY:200]; 
/* Synthesized Get Method */ 
    NSLog (@"Retrieving Values %i, %i ",[t x], [t y]); 

/* another Way to retrieve the throuhg KVC Model */ 
NSLog (@" KVC Retrieveal %i ", [t valueForKey:@"x"]); 

[pool drain]; 
} 

sein kann