2011-12-28 5 views
2

最新のSDKとXCode 4.2を使用してiOS 4アプリケーションを開発しています。ARCを有効にしてプロパティを更新する

プロジェクトでARCを有効にしましたが、以前のプロジェクトをこの機能(ARC)を使用する新しいプロジェクトに移行しようとしています。

問題はセッターの実装から発生します。ここに私のクラスには、(古いバージョン)です:

@interface RouteView : MKAnnotationView 
{ 
    /** 
    */ 
    MKMapView* _mapView; 

    ... 
} 

@property (nonatomic, retain) MKMapView* mapView; 

とその実装:

@implementation RouteView 

@synthesize mapView = _mapView; 

-(void) setMapView:(MKMapView*) mapView 
{ 
    [_mapView release]; 
    _mapView = [mapView retain]; 

    [self regionChanged]; 
} 

私はsetMapView:法上の2つの最初の行に2つのコンパイルエラーを取得します。

ARCを有効にしてカスタムセッターメソッドを実行するにはどうすればよいですか?あなただけのARCでこれを行うことができ

答えて

3

を、あなたは、もはやそれが保持して置くとリリースは、コンパイル時のコール自動参照カウントを持っているとして、オブジェクトを保持/解放する必要がありません。ちょうどあなたがいずれかを削除していないことを確認してください

  • [myObject retain]
  • [myObject release]

:古いプログラムをマージするとき

クイックフィックスとして、あなたは持っている任意の行をコメントアウトすることができますその部分を削除すると機能が失われます。アプリケーションでは、[mapView retain]mapViewに置き換える必要があります。オブジェクトを保持するだけで、オブジェクトを設定する必要があります。

-(void) setMapView:(MKMapView*) mapView 
{ 
    //[_mapView release];   //Don't need this line anymore. 
    //_mapView = [mapView retain]; //Don't need this line either. 

    _mapView = mapView //You still want to set the mapView, just not retain it. 

    [self regionChanged]; 
} 
+5

「それは自動ガベージコレクションを持っている」これは真実ではありません:

だからあなたsetMapView方法は次のようになります。ガベージコレクションとはまったく異なる自動参照カウントを持っています。 ARCの挿入は、コンパイル時にあなたのコードに保持され、解放されます。ガベージコレクションは実行時に行われ、オブジェクトグラフでは使用されなくなったエンティティを監視します。それは重要な違いです。 –

+0

@JackLawrenceおっと!明確化のためにありがとう、私は私の答えを編集しました。 – johnluttig

0

:ARCで

-(void) setMapView:(MKMapView*) mapView 
{ 
    _mapView = mapView; // direct assignment to a strong ivar; let ARC do its thing 

    [self regionChanged]; 
} 
関連する問題