문제

알겠습니다. 이 문제가 발생했습니다.내가 하고 싶은 일은 지도에 여러 주석을 수동으로 추가하는 것입니다.주석을 하나만 추가하면 완벽하게 작동합니다.핀이 떨어지면 클릭하여 설명선을 볼 수 있습니다. 인생은 좋습니다.

문제는 하나 이상을 추가하려고 할 때 발생합니다.두 번째를 추가하면 갑자기 핀의 색상이 올바르게 지정되지 않습니다(예:크기에 따라 특정 색상이어야 하지만 이제 둘 다 동일합니다…) 그리고 더 중요한 것은 설명선을 보기 위해 클릭하면 exex_bad_access와 함께 앱이 충돌합니다.무엇이 문제인지 전혀 모르겠습니다. 지도에 뷰를 너무 많이 추가하고 있는 것은 아닐까요?하지만 핀은 9개뿐이고 핀 자체도 괜찮습니다.내 코드는 다음과 같습니다…

    - (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;
}

두 번째 기능을 제거하려고 시도했지만 아무 것도 수행하지 않았습니다.

도와 주셔서 감사합니다!추신: 추가해야 할 점은 일반적으로 주석을 클릭하면 작동하는 핀 9개 중 한두 개가 있다는 것입니다…

프로그램에서 수동으로 두 개의 주석만 수동으로 작성하려고 해도(예: 루프 제거) 여전히 실패하고 색상이 여전히 잘못됩니다.

도움이 되었습니까?

해결책 4

그래서 대답은 내가 계속해서bus1에 init 객체를 보내서 혼란스러워졌다는 것입니다.

"안녕 데이비드,

귀하의 데이터 모델이 제 눈에는 빡빡해 보입니다.initWithStop을 반복적으로 보내는 버스 개체는 하나만 있습니다.에게.

도움이 되었기를 바랍니다.

행운을 빌어요!"

도와주셔서 감사합니다!여러분 모두 저에게 많은 도움을 주었습니다!

다른 팁

메모리 관리가 stops 변수가 잘못되었습니다.가변 배열을 할당한 다음 해당 배열을 반환 값으로 바꿉니다. -[Bus returnStops], 그런 다음 해제하세요.또한 무슨 일이 일어나고 있는지 명확하지 않습니다. bus2 - 하다 -[Bus initWithStop:] 반환하다 다른 대신에 Bus?어떤 방법으로든 보내는 것은 일반적이지 않습니다. -init* 이미 초기화된 객체에 대해.아마도 Cocoa Touch의 메모리 관리 규칙에 대해 혼란스러워하실 것 같습니다.다음은 기사 및 기타 참고 자료 모음입니다. 코코아 메모리 관리에 대해 (동일한 짐승입니다).

주석을 추가하는 대신 AddAnnotations를 사용해 보셨나요?- (void)주석 추가:(NSArray *)주석.이것은 당신에게 도움이 될 수 있습니다...하지만 위의 답변과 추가 조사를 보면 viewDidLoad에 일부 메모리 관리 문제가 있습니다(이것이 문제의 원인은 아닐 수도 있지만 그럴 수도 있습니다).먼저 배열을 할당(중지)한 다음 버스 개체의 일부 배열로 이를 검증하면 누수가 발생합니다.또한 참조 횟수를 늘리지 않고 실제로 버스 개체에 있는 배열을 해제하므로 충돌을 일으킬 수 있는 해당 배열을 해제합니다.initWithStop이 무엇을 하고 있는지 잘 모르겠지만 initWithStop이 객체를 유지하는 경우 여기서도 누출이 발생할 수 있습니다.

나는 이것을 메모리 관리 문제라고 부르지 않을 것입니다. 단지 배열 참조를 잘못 사용하고 있다고 말하고 싶습니다.

NSMutableArray *stops = [[NSMutableArray alloc] init]로 배열을 구성한 후 다음 단계는 [stops addObject:] 저장하려는 각 정류장을 추가합니다.

이후?실제로 무엇을 하려는지 명확하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top