Ich versuche, UIImageView Erweiterung von AFNetworking2.6.3 zu verwenden, um Bilder von einem Remote-Server zu erhalten. Alles funktioniert einwandfrei, Bilder wurden erfolgreich zurückgegeben und gerendert. aber ich habe einen Zyklus Warnung in Xcode7.3.1 behalten: Capturing ‚Zelle‘ stark in diesem Block wird wahrscheinlich zu einem Zyklus beibehaltenKein Retain-Zyklus, aber warum wurde Retain-Cycle-Warnung erhalten?
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if(self.dataSourceModel) {
Model *model = self.dataSourceModel.items[indexPath.row];
NSURL *url = [NSURL URLWithString:model.imageURL];
NSURLRequest *theRequest = [NSURLRequest requestWithURL:url];
UIImage *placeholderImage = [UIImage imageNamed:@"placeholder"];
//I don't use __weak cell in the block
[cell.imageView setImageWithURLRequest:theRequest placeholderImage:placeholderImage success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull image) {
cell.imageView.image = image; //get warning at this line
[cell setNeedsLayout];
} failure:nil];
}
return cell;
}
führen
ich seit der Zelle Beispiel sehen kann, wurde in dem Block eingefangen , also besitzt der Block die Eigentümerschaft der Zelleninstanz (und auch von cell.imageView). Wenn der Retain-Zyklus wirklich existiert, sollte die Zelle oder imageView den Besitz des Blocks besitzen.
aber ich habe die UIImageView+AFNetworking.h und UIImageView+AFNetworking.m Quellcode überprüft, die UIImageView hat keine Eigenschaft von Blöcken. Der Block ist nur ein Parameter der Methode, keine Instanzvariable. UITableViewCell besitzt auch nicht die Eigentumsrechte an den Blöcken.
Ich habe sogar Leaks verwendet, um zu überprüfen, und Leaks hat keinen Fehler gemeldet.
Also ich glaube, es gibt keinen Retain-Zyklus hier, aber warum bekomme ich immer noch die Xcode-Warnung hier ?? Wenn ich __weak Zelle __weak UITableViewCell *weakCell = cell;
verwende, wird die Warnung weggehen. Aber ich will immer noch wissen:
- hat es hier einen Retain-Zyklus?
- brauche ich wirklich __weiche Zelle?
- oder vielleicht ImageView oder Zelle hat wirklich den Besitz des Blocks, die ich nicht realisiert habe?
Alle Hinweise helfen, vielen Dank.
thx für Ihre Antwort. Jetzt sehe ich, dass es keinen Retain-Zyklus gibt. Aber ich verstehe nicht deine Bedeutung von ** den Code im Completion Block wegzulassen. ** Meinst du das Senden eines Null-Erfolgsblocks oder eines leeren Erfolgsblocks? Ich schaue auf AFNetworking Bildansicht Unterklasse (Zeile 152). Nur wenn der Erfolg ist Null, dann AFNetworking setImage für mich. Also, wenn mein Verständnis korrekt ist, denke ich, dass ich setImage und setNeedsLayout im Erfolgsblock manuell aufrufen muss. – Lyn
Könnten Sie mir das Code-Beispiel geben, wie man das mehod '[cell.imageView setImageWithURLRequest: placeholderImage-Erfolg: failure:];' verwendet, um Bilder ohne Xcode-Warnung zu erhalten? – Lyn
@Lyn, ich denke, die Methode sollte gut mit einem Null-Vervollständigungsblock funktionieren. (Beachten Sie 'if (success)' in Zeile 149 der UIImageView + AFNetworking.m. Produziert das keine Bilder in der Bildansicht? Wenn nicht, implementieren Sie den Fehlerblock, um zu sehen, ob Sie einen Hinweis darauf bekommen können, was schief läuft. – danh