0

インスタンス変数の1つを解放して、新しい値を再割り当てしようとすると、問題が発生します。

インスタンス変数が指すアドレスを解放し、それに新しい値を再割り当てしたいと思います。

コードは次のようになります。.h

@interface MapPageController : UIViewController<MKMapViewDelegate> {
 AddressAnnotationManager *addAnnotation;
}
- (IBAction) showAddress;
@property (nonatomic, retain) AddressAnnotationManager *addAnnotation;

彼ら

@synthesize addAnnotation;
- (IBAction) showAddress {
        if(addAnnotation != nil) {
  [mapView removeAnnotation:addAnnotation];
  [addAnnotation release]; // this generates the problem
  addAnnotation = nil;
 }
 addAnnotation = [[AddressAnnotationManager alloc] initWithCoordinate:location];
 addAnnotation.pinType = userAddressInput;
 addAnnotation.mSubTitle = addressField.text;
}

ただし、を使用すると[addAnnotation release]、プロセスが実行される場合、EXC_BAD_ACCESSが常に発生します。

したがって、私はメモリアドレスを次のように出力しましdeallocAddressAnnotationManager

- (void)dealloc {
 NSLog(@"delloc Instance: %p", self);
 [super dealloc];
}

ゾンビをオンにすると、コンソールから次のようなメッセージが表示されます。

2010-10-10 17:02:35.648 [1908:207] dellocインスタンス:0x46c7360

2010-10-10 17:02:54.396 [1908:207]-[AddressAnnotationManagerリリース]:割り当て解除されたインスタンス0x46c7360に送信されたメッセージ*

deallocこれは、問題が発生する前にコードが到達することを意味します。

addAnnotationをリリースできる可能性のあるすべての場所を確認しました。しかし、何も見つかりませんでした。

誰かがたまたま問題が何であるかを見つけますか?

4

1 に答える 1

2

addAnnotationこれは変数を含むコード全体ではないのではないかと思います。ほとんどの[mapView removeAnnotation:addAnnotation];場合、をリリースaddAnnotationすると、参照カウントがすでにゼロになります。コードのどこかにこのようなものがありますか?

 [mapView addAnnotation:addAnnotation];
 [addAnnotation release];

もしそうなら、あなたはaddAnnotationの完全な所有権をmapViewに譲渡しました、そしてあなたはそれをもう解放する必要はありません、それはそれで十分showAddressであることを意味します。removeAnnotation:

于 2010-10-10T09:54:44.307 に答える