2011-03-10 5 views
2

je crée un objet NSArray dans le fichier .h:NSArray cycle de vie

NSArray *tempArray; 

et que j'alloc dans le fichier .m dans la méthode viewDidLoad():

tempArray = [[NSArray alloc] init]; //initilaize 
tempArray = [connect connectSeriesJSonBack]; //fill it (I try it works) 

Mais je veux utiliser ce tableau dans une autre méthode comme:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView 

Comment organiser le cycle de vie du tableau parce que j'utilise alloc, etc conserver aucune façon à nouveau les données du tableau de portée.

+0

une autre méthode dans la même classe... ? –

+0

oui mihir même classe, je ne comprends pas pourquoi je ne peux pas atteindre les données de tableau? – NevzatR

+0

si vous avez créé tempArray dans le fichier .h ... alors vous devriez directement accéder au tempArray à travers cette classe ... pas besoin de faire quoi que ce soit .... sauf si vous le libérez avant d'y accéder –

Répondre

2

Votre deuxième affectation pour TempArray va générer une fuite de mémoire parce que l'allocation ne peut jamais être à nouveau accessible. connectSeriesJSonBAck retournera probablement un autoreleased NSArray. Si vous voulez garder le référencement en dehors de la portée actuelle, vous devez le conserver:

au lieu de:

tempArray = [[NSArray alloc] init]; //initilaize 
tempArray = [connect connectSeriesJSonBack]; //fill it (I try it works) 

do

tempArray = [connect connectSeriesJSonBack]; 
[tempArray retain]; 

et ajoutez [tempArray release] dans votre méthode de classe dealloc.

+0

Merci Diederik, ça marche Je devrais lire un tutoriel de gestion de la mémoire. Mais pouvez-vous le dire rapidement? Pourquoi je ne dois pas allouer, init cet objet et le conserver? – NevzatR

+0

Vous avez demandé Diederik, mais probablement je pourrais vous donner la réponse, c'est parce que ce que vous obtenez de [connect connectSeriesJSonBack]; est un nsarray alloué.vous devez juste le conserver. – Csabi

+0

[connect connectSeriesJSonBack] n'a aucune idée de ce que vous lui attribuez - faire [[NSArray alloc] init] crée un objet totalement nouveau, puis [connect connectSeriesJSonBack] fait la même chose - gaspiller un objet. Pour votre autre question, lisez http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html%23//apple_ref/doc/uid/20000043-BEHDEDDB – Dre

0

Si vous souhaitez accéder au même tableau dans la classe, vous pouvez probablement essayer d'en faire une variable de classe afin que ses membres puissent être consultés dans toute la classe.

+1

Le terme est "instance variable "ou" ivar " – dreamlax

0

Je suggère de DECLAR dans implemantation comme

@implementation YourViewController 

NSMutableArray *mutableExample; 
// or 
NSArray *example; 

puis dans -()viewdidload alloc comme mutableExample = [[[NSMutableArray alloc] init]retain]; ou tout simplement example = [[NSArray alloc] init];

et vous pouvez l'utiliser tous les where.do pas oublier de le libérer! !!

espère que cela aide si quelque chose ne sait pas demander dans le commentaire

wblade

+1

Merci Csabi pour votre réponse et aide .. – NevzatR

3

Ne relâchez pas le tableau dans la méthode, et au lieu de libérer dans la méthode dealloc - cette façon, vous pouvez utiliser il d'autres endroits.

Sinon, il y a un autre problème ici.

Ici vous créez une retenue, vide, immuable NSArray

tempArray = [[NSArray alloc] init]; 

Et maintenant vous écrasez le pointeur sur celui retenu par exemple, youpi, vous venez fuyait NSArray

tempArray = [connect connectSeriesJSonBack]; 

Et la méthode devrait retourner un NSArray autoreleased. Ce qui sera automatiquement libéré et disparaîtra une fois que vous avez frappé une boucle d'événement.

Vous devriez faire quelque chose comme ça

-(void)whereverThisIs { 
    // Do not retain here if connectSeriesJSonBack returns a retained instance 
    tempArray = [[connect connectSeriesJSonBack] retain]; 
} 

-(void)dealloc { 
    [tempArray release]; 
} 

-(void)anotherMethod { 
    if (tempArray) { // Do things } 
} 
+1

Il est vraiment expliqué bonne réponse merci Dre – NevzatR

0

Si vous renvoyez une matrice d'autoreleased à partir de la fonction [connect connectSeriesJSonBack];, votre tempArray aura un nombre de retour égal à 0 après la méthode viewDidLoad.

Il y a 2 approches comment faire fonctionner

1) utiliser un objet NSMutableArray et ajoutez les objets

tempArray = [[NSMutableArray alloc] init]; 
[tempArray addObjectsFromArray:[connect connectSeriesJSonBack]]; 

2) conserver le tableau retourné

tempArray = [[connect connectSeriesJSonBack] retain];