【问题标题】:Releasing Singletons释放单例
【发布时间】:2012-09-03 16:00:52
【问题描述】:

我想知道你将如何释放单例

+ (DSActivityView *)activityViewForView:(UIView *)addToView withLabel:(NSString *)labelText width:(NSUInteger)labelWidth;
 {
    // Not autoreleased, as it is basically a singleton:
    return [[self alloc] initForView:addToView withLabel:labelText width:labelWidth];
 }

使用分析工具进行分析时,我收到以下错误: 第 90 行对象的潜在泄漏。这是返回的行。

我尝试过自动释放来解决错误消息问题,但我不相信它是正确的解决方案,因为我读到自动释放单例并不好。有人能帮助我确定如何最好地释放这个对象吗?

谢谢

【问题讨论】:

  • 我看不出你在哪里使用单例...

标签: ios iphone objective-c memory-management


【解决方案1】:

分析器给你警告的原因,基本上是方法名:

+ (DSActivityView *)activityViewForView:(UIView *)addToView withLabel:(NSString *)labelText width:(NSUInteger)labelWidth;

根据Objective-C约定,所有以“create”/“new”/...开头的方法名都返回一个保留对象;您的方法属于便利构造函数的类别,预计会返回自动释放的对象,因此会发出警告。

另一方面,你说这是一个单例,但实际上不是。因此,您最终可能会多次调用此方法,从而导致实际泄漏。使您的方法更安全(并且更像单例)的基本方法是:

+ (DSActivityView *)activityViewForView:(UIView *)addToView withLabel:(NSString *)labelText width:(NSUInteger)labelWidth;
{
    static DSActivityView* gDSActivityViewSingleton = nil;
    if (!gDSActivityViewSingleton)
          gDSActivityViewSingleton = [[self alloc] initForView:addToView withLabel:labelText width:labelWidth];
    return gDSActivityViewSingleton;
}

这既可以让分析仪放松,又可以让您在方法误用的可能性面前更加安全。

【讨论】:

    【解决方案2】:

    使用自动释放。没有理由不这样做。基本上,对象的所有权属于对象,因此您永远无法手动释放它。由于它是一个单例,你是否拥有它并不重要,因为大概下次你调用它并在范围内需要它时,你将使用另一个方便的方法,它会再次被实例化。

    如果您想拥有该对象的所有权,那么您需要照常实例化它,然后您将能够保留和释放它。

    另外,请阅读 sergio 的编辑,了解它不是“正确的”单身人士。 :p

    另外,如果可以的话,转换成 ARC,你就不用担心这个了!

    【讨论】:

    • 不幸的是,该项目也需要从 4 开始在旧设备上工作,所以我不能使用 ARC :(
    • arc 在 iOS 4 及更高版本上受支持 :) stackoverflow.com/questions/7747783/… - 基本上只是不要使用 weak 引用。
    【解决方案3】:

    你做错了。考虑:

    如果你多次调用activityViewForView,你不会一遍又一遍地得到同一个对象。它只会初始化一个新对象并给你指向它的指针!!!

    要使这个东西成为单例,你必须将创建的对象存储在一个常量变量中,并确保在你的应用程序运行时始终引用这个对象(例如在 appDelegate 中声明指向这个对象的指针)。

    然后每次调用activityViewForView 时都必须检查常量变量是否指向有效对象。如果是,则返回有效对象,如果不是,则创建它并将其存储在常量静态变量中(仅创建一次)。

    如果您确实使用了 ARC,那么一切就绪。如果没有,释放你的对象(使用 dealloc 方法)

    【讨论】:

      猜你喜欢
      • 2012-02-17
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多