2011-12-28 29 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:方法在兩個第一線兩條編譯器錯誤。

我可怎麼辦啓用了ARC定製的setter方法?

回答

3

有了ARC,您不再需要釋放/保留的對象,因爲它有提出保留和釋放在編譯時調用自動引用計數。

由於速戰速決合併的舊程序的時候,你可以註釋掉有任何行:

  • [myObject retain]
  • [myObject release]

只要確保你不刪除任何功能,當你刪除該部分。在您的應用程序中,您需要將[mapView retain]替換爲mapView,因爲您仍然需要設置對象,而不保留它。

所以你setMapView方法會是這個樣子:

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

「它具有自動垃圾回收」這是不真實的。它具有自動引用計數,這與垃圾收集完全不同。 ARC插入在編譯時保留並釋放到您的代碼中。垃圾收集在運行時發生,並監視您的對象圖表以查找不再使用的實體。這是一個重要的區別。 – 2011-12-28 07:51:19

+0

@JackLawrence哎呀!謝謝你澄清,我編輯了我的答案。 – johnluttig 2011-12-28 07:53:24

0

你可以做這與ARC:

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

    [self regionChanged]; 
}