【问题标题】:Updating a property with ARC enabled在启用 ARC 的情况下更新属性
【发布时间】:2011-12-28 07:27:42
【问题描述】:

我正在使用最新的 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 的情况下执行自定义设置方法?

【问题讨论】:

    标签: objective-c ios xcode memory-management


    【解决方案1】:

    使用 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];
    }
    

    【讨论】:

    • “它有自动垃圾回收”这是不真实的。它具有自动引用计数,这与垃圾收集完全不同。 ARC 在编译时为您插入保留和释放到您的代码中。垃圾收集发生在运行时,并监视您的对象图中不再使用的实体。这是一个重要的区别。
    • @JackLawrence 哎呀!感谢您的澄清,我编辑了我的答案。
    【解决方案2】:

    您只需使用 ARC 即可:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      • 2012-01-28
      • 2018-03-06
      • 2012-04-27
      • 2017-09-09
      相关资源
      最近更新 更多