2012-09-03 25 views
0

我想知道你将如何释放一个单身释放单身

+ (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 潜在的泄漏这是一个返回行。

我已经尝试autorelease解决了错误消息的问题,但我不相信它正确的解决方案,因为我读了autoreleasing单身并不好。有人能够帮助我确定如何最好地释放这个对象吗?

感谢

+1

我不知道你在哪里使用一个单身... – Martin

回答

2

之所以仪给你的警告,基本上方法名称:

+ (DSActivityView *)activityViewForView:(UIView *)addToView withLabel:(NSString *)labelText width:(NSUInteger)labelWidth; 
根据Objective-C的约定

,所有的方法名以“创造” /”新“/ ...返回一个保留的对象;你的方法属于便利构造函数的类别,这些构造函数有望返回自动释放对象,因此是警告。

另一方面,你说这是一个单身人士,但事实上并非如此。所以,你最终可能会不止一次地调用这个方法,从而产生实际的泄漏。一个基本的方法,使您更安全的方法(多单类)是:

+ (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; 
} 

这样既能使分析器放松,给你的方法的误用的可能性更前面的安全。

1

使用autorelease。没有理由不这样做。基本上,对象的所有权属于对象,所以你永远不能手动释放它。作为一个单例,不要紧,如果你不拥有它,因为大概下次你调用它并需要它在范围内时,你会使用另一个便捷方法,它会被再次实例化。

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

另外,阅读塞尔吉奥的编辑关于它不是一个“适当的”单身人士。 :p

此外,如果可以的话,转换为ARC,您不必担心这一点!

+0

不幸的是,项目需要工作在4以上的旧设备,所以我不能使用ARC :( – CodeGeek123

+0

弧是支持iOS 4及以上版本:) http://stackoverflow.com/questions/7747783/is-arc-really-supported-in-ios-4-the-ios-4-2-sdk-is-missing-arc-相关符号 - 基本上就是不使用'weak'引用。 –

1

你做错了。考虑:

如果您多次调用activityViewForView,您将无法一次又一次地获取同一个对象。它只会初始化一个新的对象,并给你指针!

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

然后每次你打电话activityViewForView你必须检查常量变量,如果它指向一个有效的对象。如果是这样,返回有效对象,如果没有,创建它并将其存储在常量静态变量中(创建只完成一次)。

如果你确实使用ARC,你就全部设置好了。如果没有,释放你的对象(使用dealloc方法)