Potížím při přidávání více anotace map

hlasů
1

Ok, tak jsem s tímto problémem. To, co chci udělat, je ručně přidat několik poznámek k mapě. Když přidám jen jednu poznámku, to funguje bezchybně. Kolíkové kapky, můžete kliknout na něj vidět jeho popisku, život je dobrý.

Problém nastává, když chci přidat více než jeden. Když jsem se přidat druhý, náhle pin to nejsou barevné správně (tedy v závislosti na jejich velikosti by měly být určité barvy, ale oni jsou teď oba stejné ...), a co je důležitější, když na ně kliknete, aby jejich Popisek, aplikace havaruje s exex_bad_access. Já opravdu nemám ponětí, co se děje, možná jsem přidáním příliš mnoho názorů na mapě? Ale je to jen 9 kolíků a kolíky sami přidat pohodě. Tady je můj kód ...

    - (void)viewDidLoad {
    [super viewDidLoad];
    NSMutableArray *stops = [[NSMutableArray alloc] init];  //Get list of all the stops available
    Bus *bus1 = [[Bus alloc] init];                         // Bus 1 holds the stops
    stops = [bus1 returnStops];
    for (NSString *stop in stops)                           //Go through each stop to add annotation to map
    {
        Bus *bus2 = [bus1 initWithStop:stop];                //Create an instance of bus with a given stop
        MapAnnotation *eqAnn = [MapAnnotation annotationWithBus:bus2]; 
        [self.mapView addAnnotation:eqAnn];                    //Add the annotation to the map
        //[eqAnn release];
        //[bus2 release];
    }
    [self recenterMap];
    [stops release];

}
- (MKAnnotationView *)mapView:(MKMapView *)mapView 
            viewForAnnotation:(id <MKAnnotation>)annotation {
    MKAnnotationView *view = nil;
    if(annotation != mapView.userLocation) {
        MapAnnotation *eqAnn = (MapAnnotation*)annotation;
        view = [self.mapView dequeueReusableAnnotationViewWithIdentifier:@busLoc];
        if(nil == view) {
            view = [[[MKPinAnnotationView alloc] initWithAnnotation:eqAnn
                                                    reuseIdentifier:@busLoc] autorelease];
        }
        CGFloat magnituide = [eqAnn.bus.magnitude floatValue];

        if(magnituide >= .80f) {
            [(MKPinAnnotationView *)view setPinColor:MKPinAnnotationColorRed];
        } else if(magnituide >= .60f) {
            [(MKPinAnnotationView *)view setPinColor:MKPinAnnotationColorPurple];
        } else 
        {
            [(MKPinAnnotationView *)view setPinColor:MKPinAnnotationColorGreen];
        }
        [(MKPinAnnotationView *)view setAnimatesDrop:YES];
        [view setCanShowCallout:YES];
    } 

    return view;
}

dokonce pokusil vyjmutím druhou funkci, ale to nebylo nic dělat.

Děkuji za pomoc! PS Měl bych také dodat, tam je obvykle jeden nebo dva kolíky z 9, která funguje, když klepnete na poznámku ...

Pokud se i dokonce pokusit ručně jen dvě poznámky ručně do programu (tj odstranit smyčku), ale stále nedaří a barva je stále špatně ...

Položena 17/08/2009 v 18:49
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
1

Mohlo by se zdát, že správa paměti v stopsproměnné je nesprávná. Vám přidělí proměnlivý pole, pak nahradit toto pole s návratovou hodnotou -[Bus returnStops], pak uvolnit to. Také to není jasné, co se děje s bus2- se -[Bus initWithStop:]vrátí jinou instanci Bus? Není to obvyklé poslat jakoukoliv metodu -init*na již inicializovat objekt. Myslím, že jste pravděpodobně jsou zmateni konvencemi správy paměti v Cocoa Touch. Zde je sbírka článků a dalších odkazů na správě paměti Cocoa (což je stejné zvíře).

Odpovězeno 17/08/2009 v 18:55
zdroj uživatelem

hlasů
0

Takže odpověď byla, že jsem pořád posílá BUS1 objekt init, aby se dostal zmatený.

"Ahoj, Davide,

Váš datový model vypadá hosed ke mně. Máte jen jeden autobus objekt, který se opakovaně posílá initWithStop: k.

Snad to pomůže.

Hodně štěstí! "

Děkuji vám chlapi za vaši pomoc! Vy všichni pomohli mi trochu!

Odpovězeno 17/08/2009 v 20:02
zdroj uživatelem

hlasů
0

Já bych to nenazýval problém správy paměti - Jen bych říci, že používáte pole odkazy nesprávně.

Po konstrukci pole s NSMutableArray * zastaví = [[NSMutableArray alloc] init], dalším krokem je použít [zastaví AddObject:] přidat každé zastávce, které chcete uložit.

Potom? Není jasné, co se opravdu snaží.

Odpovězeno 17/08/2009 v 19:34
zdroj uživatelem

hlasů
0

Už jste se pokusil pomocí AddAnnotations místo přidat anotaci? - (void) addAnnotations: (*) NSArray anotace. To by mohlo fungovat pro vás ... ale při pohledu na předchozí odpověď a další inspekci kterou mají některé problémy, správa paměti v viewDidLoad (ačkoli thi to nemusí být příčinou problému, ale mohlo by to být). V první řadě se přidělování pole (zastávek) a potom ovveriding jej s nějakým pole v objektu Bus, bude to způsobit únik. Také se pak uvolní, že pole, které by mohly být příčinou havárie, protože jste uvolnění pole, které je ve skutečnosti v objektu Bus w niž se zvýšenou počet odkazů na něj. Nejsem si jistý, co initWithStop dělá, ale můžete se dostat únik i zde, pokud initWithStop zachová objekt.

Odpovězeno 17/08/2009 v 18:56
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more