【问题标题】:Code rewriting for getting rid of @property in objective-c ARC在objective-c ARC中为摆脱@property而重写代码
【发布时间】:2012-02-14 06:54:25
【问题描述】:

在 ARC 之前,我曾经在不使用属性的情况下在 header 中写入变量:

@interface MyViewController : UIViewController {
  NSString *prop1;
}
@end

然后在 .m 文件中我曾经保留/释放:

-(void)initVar {
  prop = @"initialized variable";
  [prop retain];
}

-(void)dealloc{
  [prop release];
}

在尝试了 ARC 一段时间后,我遇到了很多内存管理问题,从某种意义上说,很多对象都被释放了。通过将 ivar 移动到 @property 并使用点符号,我找到了最快(但很脏)的解决方案。

@interface MyViewController : UIViewController

@property(strong) NSString *prop;

@end  

我后来添加了一个只读属性,因为不需要在控制器之外访问。 我的问题是,在 ARC 环境中,我怎样才能重写上面的代码来摆脱@property,特别是我关心的是视图控制器,它们可以在应用程序的生命周期中多次获取 alloc/dealloc。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    老实说,您的问题和伪代码没有多大意义。在 ARC 下,ivar [默认情况下] 将是对对象的强引用,因此,对该 ivar 的分配将像所有其他 ARC 化对象一样进行管理。如果您在没有 ARC 的情况下编译,则不会。

    在代码中使用 ivars 还是属性是一个风格问题,与内存管理无关 [在 ARC 下 -- 在 MRR 下,您需要手动管理 ivar 引用]。

    在您的问题中,您的初始化程序示例和您的 -dealloc 都是错误的,但这可能只是因为它们是快速注释而不是真正的代码。

    如果您在 ARC 下遇到内存管理问题,那听起来像是出了问题。您是否尝试构建和分析?您确定您为所有文件开启了 ARC 吗?

    (注意,我使用 ARC 已经有一段时间了,一般来说,它是一种“正常工作”的体验。除了几个编译器错误和脆弱的边界之外,我还没有遇到任何严重的问题NS 和 CF 代码)。

    【讨论】:

    • 是的,它只是快速代码。为什么非弧编译器的dealloc错误?我同意这是一个风格问题,这就是为什么我要删除所有@prop。所以,据我了解,在 ARC 在标头中声明 var 时,应该使我的内存管理安全吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多