在启用ARC的情况下更新属性

时间:2011-12-28 07:27:42

标签: objective-c ios xcode memory-management

我正在使用最新的SDK和XCode 4.2开发iOS 4应用程序。

我在项目中启用了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的情况下执行自定义setter方法?

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

您可以使用ARC执行此操作:

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

    [self regionChanged];
}