2014-08-28 5 views
-1

J'ai une vue de table d'où j'envoie une demande les données de l'URL. Je suis capable de récupérer les données, mais je veux utiliser délégué pour renvoyer les données en mode tableau.Le délégué est NULL

Le problème est quand je mon self.delegate assigne il contient une valeur, mais quand je suis en train de renvoyer les données self.delegate deviennent 0x000000.

Dans viewcontroller.m

GNRequestManager *request = [[GNRequestManager alloc]initWithDelegate:self]; 

Dans GNRequestManager.h

#import <Foundation/Foundation.h> 
#import "GNDownloadManager.h" 

@protocol RequestManagerDelegate <NSObject> 

- (void)didReceiveData:(NSMutableArray *)data; 

@end 


@interface GNRequestManager : NSObject 

@property (nonatomic, weak) id<RequestManagerDelegate> delegate; 

-(id)initWithDelegate:(id<RequestManagerDelegate>)inDelegate; 

- (void)requestWithURL:(NSString *)urlString; 

-(void)didReceiveResponse:(NSMutableArray *)downloadData; 



@end 

Dans GNRequestManager.m

-(id)initWithDelegate:(id<RequestManagerDelegate>)inDelegate 
{ 
    self = [super init]; 

    if (self) 
    { 
     self.delegate = inDelegate; // **self.delegate has a value** 

    } 

    return self; 
} 



- (void)didReceiveResponse:(NSMutableArray *)downloadData // Fetch the data in downloadData 

{ 

    if(!itemArray) 
    { 
     itemArray = [[NSMutableArray alloc]init]; 
    } 

    itemArray = downloadData; 

    [self.delegate didReceiveData:itemArray]; // **self.delegate does not contain any value** 

} 
+0

Peut-être que la demande GNRequestManager * sera publiée si elle n'est pas conservée. –

+0

Où est la déclaration 'délégué'? – YogevSitton

+0

ajoutez l'interface pour votre gestionnaire. et je suppose que délégué est faible (il devrait être) et votre VC est désalloué –

Répondre

1

J'avais l'habitude d'avoir ce problème une fois. Autant que je peux comprendre, vous stockez votre delegate comme propriété avec le modificateur weak. Cela signifie que votre GNRequestManager n'augmente pas le nombre de références de votre objet délégué. Si vous créez objet délégué comme:

GNDelegateObject *delegate = [GNDelegateObject new]; 
GNRequestManager *manager = [[GNRequestManager alloc] initWithDelegate:delegate]; 

objet délégué sera libéré.

Vous devez conserver une référence forte à votre objet délégué ailleurs (pas dans GNRequestManager).

UPD: Vous avez mis à jour la question, que le délégué est défini comme:

GNRequestManager *request = [[GNRequestManager alloc]initWithDelegate:self]; 

self est une instance de UIViewController sous-classe.

Ce contrôleur de vue est-il toujours dans la hiérarchie du contrôleur de vue? Peut-être, vous avez rejeté/a sauté de sorte qu'il est désaffecté maintenant?

+0

Accent sur la référence forte "ailleurs". Un objet ayant une forte référence à un délégué conduira souvent à un cycle de conservation. Si tout cela n'a pas de sens, il est temps de lire la documentation d'Apple. – gnasher729

+0

@ gnasher729 "ailleurs" signifie en dehors du GNRequestManager. Edité la réponse, merci. –

+0

Je suis d'accord avec @Nikita. C'est évidemment que 'inDelegate' est libéré et supprimé, parce que le prop de' delegate'. est faible. – kelin

Questions connexes