1

わかりました、それで私はこの問題を抱えています。私がやりたいのは、地図に複数の注釈を手動で追加することです。注釈を1つだけ追加すると、問題なく機能します。ピンが落ちます、あなたはそのコールアウトを見るためにそれをクリックすることができます、人生は良いです。

複数追加したいときに問題が発生します。2つ目を追加すると、突然ピンの色が正しくなくなります(つまり、大きさによっては特定の色になるはずですが、両方とも同じになります…)。さらに重要なのは、ピンをクリックすると、ピンが表示されることです。コールアウト、アプリはexex_bad_accessでクラッシュします。何が問題なのか本当にわかりません。マップに追加するビューが多すぎるのではないでしょうか。しかし、それはたった9つのピンであり、ピン自体は問題なく追加されます。これが私のコードです…</p>

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

2番目の関数を削除しようとしましたが、何もしませんでした。

助けてくれてありがとう!PS私も追加する必要があります。通常、注釈をクリックすると機能する9つのピンのうち1つまたは2つのピンがあります…</ p>

プログラムで手動で2つの注釈だけを手動で実行しようとしても(つまり、ループを削除しようとすると)、それでも失敗し、色が間違っています...

4

4 に答える 4

1

stops変数のメモリ管理が正しくないように見えます。可変配列を割り当て、その配列をの戻り値に置き換えて-[Bus returnStops]から解放します。また、何が起こっているのかは明確ではありませんbus2-のインスタンスを-[Bus initWithStop:]返しますか?すでに初期化されているオブジェクトに対してメソッドを送信することは通常ありません。あなたはおそらくCocoaTouchのメモリ管理の慣習に混乱していると思います。これは、 Cocoaメモリ管理(同じ獣)に関する記事とその他の参考資料のコレクションです。Bus-init*

于 2009-08-17T17:55:58.933 に答える
0

注釈を追加する代わりにAddAnnotationsを使用してみましたか?-(void)addAnnotations:(NSArray *)annotations。これはあなたのために働くかもしれません...しかし、上記の答えを見て、さらに検査すると、viewDidLoadにいくつかのメモリ管理の問題があります(これは問題の原因ではないかもしれませんが、そうかもしれません)。最初に配列を割り当て(停止)、次にBusオブジェクト内の配列でそれをovveridingします。これにより、リークが発生します。また、参照カウントを増やしずに実際にBusオブジェクトにある配列を解放しているため、クラッシュの原因となる可能性のある配列を解放します。initWithStopが何をしているのかわかりませんが、initWithStopがオブジェクトを保持している場合は、ここでもリークが発生する可能性があります。

于 2009-08-17T17:56:18.963 に答える
0

私はそれをメモリ管理の問題とは呼びません-配列参照を誤って使用しているとだけ言っておきます。

NSMutableArray * stops = [[NSMutableArray alloc] init]で配列を作成した後、次のステップは[stops addObject:]を使用して、保存する各ストップを追加することです。

その後?あなたが本当に何をしようとしているのかは明らかではありません。

于 2009-08-17T18:34:15.860 に答える
0

答えは、bus1にinitオブジェクトを送信し続けたため、混乱したということでした。

「こんにちはデビッド、

あなたのデータモデルは私にはうんざりしているように見えます。initWithStop:を繰り返し送信しているバスオブジェクトは1つだけです。

お役に立てれば。

幸運を!「」

皆さん、助けてくれてありがとう!皆さんは私をかなり助けてくれました!

于 2009-08-17T19:02:01.607 に答える