Il semble que ce problème a été discrètement corrigé dans iOS 4.3. Jusqu'à présent, la distance considérée comme «assez loin» pour qu'une annotation soit recyclée semblait être des centaines de kilomètres, même avec un zoom très rapproché. Lorsque je crée mon application avec le SDK iOS 4.3, les annotations sont recyclées en fonction de limites plus raisonnables.
Est-ce que quelqu'un d'autre a rencontré ce problème? Voici le code:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(WWMapAnnotation *)annotation {
// Only return an Annotation view for the placemarks. Ignore for the current location--the iPhone SDK will place a blue ball there.
NSLog(@"Request for annotation view");
if ([annotation isKindOfClass:[WWMapAnnotation class]]){
MKPinAnnotationView *browse_map_annot_view = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"BrowseMapAnnot"];
if (!browse_map_annot_view) {
browse_map_annot_view = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"BrowseMapAnnot"] autorelease];
NSLog(@"Creating new annotation view");
} else {
NSLog(@"Recycling annotation view");
browse_map_annot_view.annotation = annotation;
}
...
Dès que la vue est affichée, je reçois
2009-08-05 13:12:03.332 xxx[24308:20b] Request for annotation view
2009-08-05 13:12:03.333 xxx[24308:20b] Creating new annotation view
2009-08-05 13:12:03.333 xxx[24308:20b] Request for annotation view
2009-08-05 13:12:03.333 xxx[24308:20b] Creating new annotation view
et ainsi de suite, pour chaque annotation (~ 60) J'ai ajoutée. La carte (correctement) affiche uniquement les deux annotations dans le rect actuel. Je suis en train de la région viewDidLoad:
if (center_point.latitude == 0) {
center_point.latitude = 35.785098;
center_point.longitude = -78.669899;
}
if (map_span.latitudeDelta == 0) {
map_span.latitudeDelta = .001;
map_span.longitudeDelta = .001;
}
map_region.center = center_point;
map_region.span = map_span;
NSLog(@"Setting initial map center and region");
[browse_map_view setRegion:map_region animated:NO];
L'entrée du journal de la région à régler est imprimé sur la console avant que des vues d'annotation sont demandées. Le problème ici est que puisque toutes les annotations sont demandées à la fois, [mapView dequeueReusableAnnotationViewWithIdentifier] ne fait rien, puisqu'il y a des MKAnnotationViews uniques pour chaque annotation sur la carte. Cela conduit à des problèmes de mémoire pour moi.
Un problème possible est que ces annotations sont regroupées dans un assez petit espace (rayon de ~ 1 mile). Bien que la carte soit agrandie de façon assez étroite dans viewDidLoad (latitude et longitude delta .001), elle charge toutes les vues d'annotations en même temps.
Merci ...
Ceci est une excellente réponse. J'avais lu la documentation, mais je suppose que le design de la file d'attente ressemblait à celui de la file d'attente. Avec les cellules de tableau, il semble qu'elles limitent la taille de la file d'attente et commencent à libérer les cellules de la table (je n'ai pas vérifié avec le débogueur, cependant). C'est bizarre que la déchéance sur la carte ne soit pas cohérente avec ça. Je me demande pourquoi, quand la logique de maintenir une liste de marqueurs qui sont à l'intérieur et à l'extérieur de la région actuelle existe déjà dans la classe, le développeur devrait répliquer cela pour obtenir des économies de mémoire réelles. Merci!! – jmans
Hum, oui, vous avez raison, c'est étrange parce que le nom est vraiment comme celui de UITableView, et comme vous l'avez dit, le mot "offscreen" laisse l'utilisateur penser qu'il devrait fonctionner comme UITableView. Et vous avez raison aussi, je pense que si vous créez une vue tabulaire avec une taille de section de 10000, vous n'obtiendrez jamais 10000 UITableViewCellView instanciées car la plupart d'entre elles sont réutilisées. idée supplémentaire: quand définissez-vous les annotations dans votre code? Êtes-vous sûr à 100% qu'il est appelé après avoir défini la valeur de la région? – yonel
Je ne suis pas sûr à 100%, mais je n'aurai plus l'occasion de jouer avec mon code jusqu'à jeudi. Je vais y jeter un autre coup d'oeil, avec votre conseil en tête, et vous faire savoir ce qui se passe. – jmans