2011-12-28 9 views
2

최신 SDK 및 XCode 4.2를 사용하여 iOS 4 응용 프로그램을 개발 중입니다.ARC를 사용하여 속성 업데이트

내 프로젝트에서 ARC를 활성화했으며 이전 프로젝트를이 기능 (ARC)을 사용하는 새 프로젝트로 마이그레이션하려고합니다.

문제는 setter 구현에서 비롯됩니다. 여기 내 클래스 (이전 버전)입니다 :

@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를 사용하도록 설정 한 사용자 정의 설정 메소드는 어떻게 수행합니까?

답변

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와 함께이 작업을 수행 할 수 있습니다 ARC와

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

    [self regionChanged]; 
} 
관련 문제