我想知道如何释放单身人士
+ (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行上物体的潜在泄漏。这是返回的线。
我尝试过自动释放解决了错误消息的问题,但我不相信它是正确的解决方案,因为我读到自动释放单例并不好。有人能帮助我确定如何最好地释放这个对象吗?
由于
答案 0 :(得分:2)
分析器给你警告的原因基本上是方法名称:
+ (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;
}
这样既可以使分析仪放松,又可以在误用方法的前提下更安全。
答案 1 :(得分:1)
使用自动释放。没有理由不这样做。基本上对象的所有权属于对象,因此您永远无法手动释放它。如果你不拥有它是没有关系的,因为大概下次你调用它并在范围内需要它时你将使用另一种方便方法,它将再次实例化。
如果您想拥有该对象的所有权,那么您将需要正常实例化它,然后您将能够保留并释放它。
另外,阅读塞尔吉奥关于它的编辑不是一个“适当的”单身人士。 :P
另外,如果可以,请转换为ARC,您不必担心这个!
答案 2 :(得分:1)
如果多次调用activityViewForView,则不会一遍又一遍地获取相同的对象。它只会初始化一个新对象,并为你提供指向它的指针!!!
要使这个东西成为一个单独的东西,你必须将创建的对象存储在一个常量变量中,并确保你的应用程序一直运行时引用这个对象(例如在appDelegate中声明你指向这个对象的指针) )。
然后每次调用activityViewForView
时,如果指向有效对象,则必须检查常量变量。如果是这样,返回有效对象,如果没有,则创建它并将其存储在常量静态变量中(创建只执行一次)。
如果您使用ARC,那么您已经完成了设置。如果没有,释放你的对象(使用dealloc方法)