2011-12-12 3 views
3

J'utilise le code suivant pour télécharger des images:Déterminer si un objet référencé faible a été désallouée

- (void)downloadImageAtUrl:(id)url 
       andDelegate:(id<IPServerDelegate>)delegate_ { 
    NSURL *correctUrl = nil; 
    if ([url isKindOfClass:[NSString class]]) 
    correctUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", kHostURL, [url substringFromIndex:1]]]; 
    else 
    correctUrl = url; 
    __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:correctUrl]; 
    [imageRequestsArray addObject:request]; 
    [request setCompletionBlock:^{ 
    if (request.responseStatusCode == 200) { 
     if (delegate_ && [delegate_ respondsToSelector:@selector(didDownloadImage:atUrl:)]) { 
     [delegate_ didDownloadImage:request.responseData atUrl:request.url]; 
     } 
    } 
    else { 
     if (delegate_ && [delegate_ respondsToSelector:@selector(failedToDownloadImageWithUrl:)]) { 
     [delegate_ failedToDownloadImageWithUrl:request.url]; 
     } 
    } 
    [imageRequestsArray removeObject:request]; 
    }]; 

    [request setFailedBlock:^{ 
    if (delegate_ && [delegate_ respondsToSelector:@selector(failedToDownloadImageWithUrl:)]) { 
     [delegate_ failedToDownloadImageWithUrl:request.url]; 
    } 
    [imageRequestsArray removeObject:request]; 
    }]; 

    [request startAsynchronous]; 
} 

Si l'objet delegate_ a été désallouée les application se bloque. Comment puis-je déterminer que l'objet delegate_ a été désalloué sans avoir à créer une référence directe? Je connais les pointeurs faibles dans iOS 5, mais mon application doit être compatible avec iOS 4.3.

Répondre

0

Ok, donc j'ai trouvé une solution. Je stocke tous les objets ASIHTTPRequest dans le tableau de demandes. Lorsque l'un de mes UIViewControllers est sur le point de disparaître (viewWillDisappear), je suis enumeration à travers le tableau et j'envoie un message d'annulation à chacun des objets de requête. Le seul inconvénient ici est que ces demandes doivent être reprises à chaque fois que la vue réapparaît, mais au moins, elle ne plante pas.

0

Eh bien, lorsque votre délégué est désalloué, je suppose qu'il s'agit d'une version. Quand il est, après:

[object release]; 

Pour ce faire:

object=nil; 

Sur votre code, puis, il suffit de vérifier si elle existe:

if(delegate_){ 

} 
+0

Merci, mais ce n'est pas une solution. Comme je l'ai dit, je ne dois pas avoir une référence directe à l'objet délégué, qui est «objet» dans votre réponse. – Eugene

+0

Hummm, donc à tout moment vous pouvez vous retrouver avec un objet désalloué? – Peres

+0

Oui, c'est exactement ainsi. – Eugene

Questions connexes