2012-04-11 5 views
3

Nouveau je suis arrivé à Objective-C,objectifC autorelease problème, quel est le problème avec le 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"]); 

}

Je n'ai pas erreur de compilation de temps, mais courir erreur de temps:

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 

On dirait qu'il ya quelque chose à voir avec problème de mémoire. Quelqu'un souligne le problème?

REMARQUE: Avec toutes vos entrées, je pourrais résoudre le problème de autorelease, mais toujours

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

n'imprime pas la valeur correcte, mais la poubelle. Est-ce que je fais quelque chose de mal?

+0

Votre question révisée n'a rien à voir avec votre question initiale. Mais la réponse est que la chaîne de format "% i" spécifie un entier tandis que 'valueForKey:' renvoie un objet. – Chuck

Répondre

4

Lorsque vous êtes dans la boucle d'exécution d'un application, il existe un pool autorelease par défaut créé pour vous. Cependant, lorsque vous utilisez votre propre main, vous devez créer manuellement un pool de libération automatique en haut de votre main et le vider périodiquement.

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

Si vous compilez avec le nouveau compilateur LLVM, utilisez la nouvelle fonction @autoreleasepool à la place.

+0

Merci pour la réponse, j'utilise GNUStep pour compiler en ubuntu et en cours d'exécution. – Whoami

+1

'@ autoreleasepool' peut être utilisé dans tous les modes Objective-C, non seulement ARC – beryllium

+0

Eh bien, j'ai ajouté comme vous l'avez suggéré, maintenant je n'ai pas l'erreur d'exécution, mais NSLog (@" KVC Retrieveal% i ", [t valueForKey: @ "x"]) ;, n'imprime pas de valeur x pourquoi? – Whoami

5

La routine principale ne crée pas de pool de libération automatique.

Utilisez l'une de ces méthodes en fonction de la version et du compilateur que vous utilisez.

récent ou ARC:

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

    // your code 

    } 
} 

ou

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

    // your code 

    [pool drain]; 
} 

Le code a de nombreux autres problèmes tels que:

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

qui devrait être

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

% @ est utilisé pour imprimer des objets,% i pour les entiers.

La ligne:

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

est intéressante car valueForKey retourne un objet (dans ce cas, un NSNumber) si la déclaration correcte est:

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

L'exécution du programme avec ces corrections produit:

Retrieving Values 100, 200 
KVC Retrieveal 100 
1

main La fonction doit avoir un pool d'autorelease.

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

     // you code 

     return ...; 
    } 
} 

EDIT:
En ce qui concerne votre deuxième partie de la question. valueForKey retours id, le jeter aux int

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

@Whoami, voir ma réponse mise à jour – beryllium

+1

Ce n'est pas un cast, c'est un appel de méthode sur l'objet retourné renvoyant un entier. – zaph

+0

Oui, je le dis pour plus de commodité. – 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]; 
} 

peut être cela fonctionnera