如何解决Singleton类泄漏问题?

时间:2014-05-29 06:55:37

标签: ios iphone objective-c ipad singleton

我在Singleton_Newmark.h文件

中使用了以下代码
#import <Foundation/Foundation.h>

@interface Singleton_Newmark : NSObject
{

    NSString *strxpos;
    NSString *strypos;
    NSString *strindex;
    NSString *strtag;



}
@property (nonatomic) NSString *strxpos;
@property (nonatomic) NSString *strypos;
@property (nonatomic) NSString *strindex;
@property (nonatomic) NSString *strtag;


+(Singleton_Newmark *)sharedInstance;
@end



   Following code used Singleton_Newmark.m file

#import "Singleton_Newmark.h"

@implementation Singleton_Newmark
@synthesize  strxpos,strypos,strindex,strtag;
+(Singleton_Newmark *)sharedInstance
{
    static Singleton_Newmark *sharedInstance = nil;
    if (!sharedInstance) {
        sharedInstance=[[Singleton_Newmark alloc]init];
    }
    return sharedInstance;
}

-(void)dealloc
{
    strxpos=nil;
    strypos=nil;
    strindex=nil;
    strtag=nil;
}
@end

我在单例类对象中插入值。

Singleton_Newmark *obj=[[Singleton_Newmark alloc]init];
                  obj.strxpos=@"Some string";
        obj.strypos=@"Some string";
        obj.strindex=@"Some string";
        obj.strtag=@"Some string";

再次从单例类对象中读取

Singleton_Newmark *obj=[Singleton_Newmark sharedInstance];
        obj=[Dict objectForKey:@"forkey"];

我收到来自analyze的泄漏消息:

 Value stored to 'obj' during its initialization is never read

但是我在最后一行收到了分析泄漏错误(再次从...中读取)。如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

实现单吨模式的正确方法是隐藏init方法。你可以通过以下方式实现:

- (id)init __attribute__((unavailable("cannot use init for this class, use +(Singleton_Newmark*)sharedInstance instead")));

这将阻止用户使用init方法。因此他们将被迫仅使用sharedInstance方法。即使您将代码发布为库,也可以为您提供代码的清晰表示。

这将在您的方法中写下:

+ (Singleton_Newmark *)sharedInstance {
    static Singleton_Newmark *sharedInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [self new];
    });
    return sharedInstance;
}

答案 1 :(得分:1)

更改此行:

Singleton_Newmark *obj=[[Singleton_Newmark alloc]init];

这一行

Singleton_Newmark *obj = [Singleton_Newmark sharedInstance];

__________编辑(忘记此部分并阅读评论):__________

并移动

   static Singleton_Newmark *sharedInstance = nil;

以外的

+(Singleton_Newmark *)sharedInstance{ … }

方法(或者每次都重置它,永远不要将它重复为单例)

__________ END EDIT __________

如果您使用普通的alloc + init方法,那么您不会将您的类用作单例,并且每次传递该行时都使用新实例,并且永远不会释放它,这就是你泄漏记忆的原因。

为此你需要使用静态方法sharedInstance,这样你第一次得到一个新实例,不要发布它,然后你下次传递那个代码就得到同一个实例