单例实现存在问题

问题描述

| 我在单例实现上遇到了问题。我想放在单身人士身上的物件似乎损坏了,我不知道为什么。任何帮助表示赞赏。 这是单例的代码: SessionServices.h
    #import <Foundation/Foundation.h>

/**
 This class provides a simple way of getting information about the connected user
*/
@class  UserIHM;
@interface SessionServices : NSObject {
    @private
    UserIHM *user; //the object to retain
}

@property (nonatomic,retain) UserIHM *user;
sessionServices.m
@implementation SessionServices
@synthesize user;

static SessionServices *INSTANCE = nil;

+ (SessionServices*)sharedInstance
{
    if (INSTANCE == nil) {
        INSTANCE = [[super allocWithZone:NULL] init];
    }
    return INSTANCE;
}
....
//singleton impl from apple documentation
...
}
userIHM.h
@interface UserIHM : NSObject {
    @private
    NSString *tagUID;
    NSString *username;
    BOOL isAdmin;
}

@property (nonatomic,retain) NSString *tagUID;
@property (nonatomic,retain) NSString *username;
@property (nonatomic) BOOL isAdmin;
然后在SessionServices.m中,我调用:
user = [[IHMObjectFinderServices sharedInstance] getUserByTagUID:userTagUID];
并且用户的所有字段都填充有正确的信息。 塔吉德= 2ac6912a 用户名= Mike isAdmin =否 然后我尝试使用此信息设置UITableView的标题
self.navigationItem.title = [NSString stringWithFormat:@\"Projects: %@\",[[[SessionServices sharedInstance] user] username]];
如果我使用NSLog并使用调试器,则可以看到用户名变成了   无效的CFString 我究竟做错了什么 ?     

解决方法

根据您的评论,您遇到的问题取决于您未在单例实现中初始化* user ivar的事实。 为此,请定义适当的“ 5”方法。在这方面(初始化),单例的行为类似于普通类。
- (id)init {
    self = [super init];
    if (self != nil) {
       user = [[UserIHM alloc] init];   //-- sergio: added alloc/init
       user.username = @\"\";
       user.tagUID = @\"\";
       user.isAdmin = NO;
    }
    return (self);
}
    ,这个习语稍微好一点:
+(SessionServices *)singleton {
    static dispatch_once_t pred;
    static SessionServices *shared = nil;
    dispatch_once(&pred,^{
        shared = [[SessionServices alloc] init];
        // init your variables here
        shared.blah = blahblah;
    });
    return shared;
}
有关说明,请参阅单身人士的护理和喂养。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...