Objective c 单例实现的问题

Objective c 单例实现的问题,objective-c,singleton,memory-management,retain,Objective C,Singleton,Memory Management,Retain,我对单例实现有一个问题。这似乎是一个目标,我想在我的单身得到损坏,我不明白为什么。谢谢你的帮助 以下是singleton的代码: 会话服务 #import <Foundation/Foundation.h> /** This class provides a simple way of getting information about the connected user */ @class UserIHM; @interface SessionServices :

我对单例实现有一个问题。这似乎是一个目标,我想在我的单身得到损坏,我不明白为什么。谢谢你的帮助

以下是singleton的代码: 会话服务

    #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;
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];
并且用户的所有字段都会填入正确的信息

taguid=2ac6912a 用户名=迈克 isAdmin=NO

然后我尝试使用此信息设置UITableView的标题

self.navigationItem.title = [NSString stringWithFormat:@"Projects: %@",[[[SessionServices sharedInstance] user] username]];
如果我登录并使用调试器,我可以看到用户名变成一个

无效的CFString


我做错了什么?

根据您的评论,您遇到的问题取决于您没有在singleton实现中初始化*用户ivar这一事实

为此,请定义适当的
-init
方法。在这方面(初始化),单例的行为与普通类类似

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

有关说明,请参阅。

如何在singleton中初始化
UserIHM*user
?您没有在代码中显示…@sergio thans对于您的答案,这可能是问题所在,但我不确定在哪里初始化它,因为sharedInstance是一个类方法。我以为它是在user=[[IHMObjectFinderServices sharedInstance]getUserByTagUID:userTagUID]行初始化的@albertamg感谢您的回答,我会尝试一下。事实上,在分配
共享状态时,您也在调用
-init
。。。你只需要一个实现…谢谢你的回答,我会试试的
-(id)init{self=[super init];if(self!=nil){user.username=@'';user.tagUID=@'';user.isAdmin=NO;}返回(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;
}