【问题标题】:problem with a singleton implementation单例实现的问题
【发布时间】:2011-05-25 15:14:42
【问题描述】:

我遇到了单例实现的问题。我想在我的单身中保存的一个对象似乎被破坏了,我不知道为什么。任何帮助表示赞赏。

这里是单例的代码: 会话服务.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
...
}

用户IHM.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 = 否

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

self.navigationItem.title = [NSString stringWithFormat:@"Projects: %@",[[[SessionServices sharedInstance] user] username]];

如果我 NSLog 并使用调试器,我可以看到用户名变成了

CFString 无效

我做错了什么?

【问题讨论】:

  • 如何在单例中初始化UserIHM *user?您没有在代码中显示...
  • @sergio thans 你的回答,这可能是问题所在,但我不确定在哪里初始化它,因为 sharedInstance 是一个类方法。我以为它在 user = [[IHMObjectFinderServices sharedInstance] getUserByTagUID:userTagUID];
  • @albertamg 谢谢你的回答,我会试试的

标签: objective-c singleton memory-management retain


【解决方案1】:

这个成语稍微好一点:

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

请参阅Care and Feeding of Singletons 了解说明。

【讨论】:

    【解决方案2】:

    根据您的评论,您遇到的问题取决于您没有在单例实现中初始化您的 *user 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);
    }
    

    【讨论】:

    • 确实,你在分配sharedInstance的时候也调用了-init...你只需要一个实现...
    • 感谢您的回答,我会试试的! - (id)init { self = [super init]; if (self!=nil) { user.username = @""; user.tagUID = @""; user.isAdmin = NO; } return (self); } 对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多