我在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
但是我在最后一行收到了分析泄漏错误(再次从...中读取)。如何解决这个问题?
答案 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
,这样你第一次得到一个新实例,不要发布它,然后你下次传递那个代码就得到同一个实例