无法为单例中的 BOOL 字段赋值

Posted

技术标签:

【中文标题】无法为单例中的 BOOL 字段赋值【英文标题】:Can't assign value to a BOOL field in a Singleton 【发布时间】:2011-08-13 16:19:48 【问题描述】:

我有这个单身人士:

UserData.h

@interface UserData : NSObject 
    User *user;


+ (UserData *)sharedUserData;

@property (nonatomic, retain) User *user;

UserData.m

@implementation UserData

@synthesize user;

SYNTHESIZE_SINGLETON_FOR_CLASS(UserData);

- (id) init

    self = [super init];
    if (self != nil) 
    
    return self;


- (void) dealloc

    [user release];
    [super dealloc];


@end

User.h

@interface User : NSObject

    int user_id;
    NSString *username;
    BOOL logged_in;


@property (nonatomic, assign) int user_id;
@property (nonatomic, retain) NSString *username;
@property (nonatomic, assign, getter=isLogged) BOOL logged_in;

@end

User.m

@implementation User

@synthesize user_id, username, logged_in;

- (id)init

    self = [super init];
    if (self) 
        // Initialization code here.
    

    return self;


@end

在应用委托中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window.rootViewController = self.tabBarController;

    BOOL logged_in = FALSE; // hardcoded for testing  

    UserData *userData = [UserData sharedUserData];
    [[userData user] setLogged_in:logged_in];

    if (!logged_in) 
        [self hideTabBar:self.tabBarController];
    

    [self.window makeKeyAndVisible];
    return YES;

到这里为止,它就像一个魅力。问题是在LoginViewController 中我更改了logged_in 的值:

BOOL logged_in = TRUE;    

UserData *userData = [UserData sharedUserData];
[[userData user] setLogged_in:logged_in];

if (userData.user.isLogged) 
    NSLog(@"You're logged in.");
 else 
    NSLog(@"You're not logged in.");

调试控制台提示我“您尚未登录”。为什么这个?怎么了?

【问题讨论】:

您可能希望在其初始化中为您的单例的可变用户分配内存。 【参考方案1】:
- (id) init

    self = [super init];
    if (self != nil) 
      self.user = [[User alloc] init];
    
    return self;

您还需要为单例的单个元素分配内存。

【讨论】:

谢谢!奇迹般有效。 :)

以上是关于无法为单例中的 BOOL 字段赋值的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 为单选、选择或复选框输入赋值

C# 类声明一个数组字段,无法赋值,说变量在声明前无法使用

为啥析取赋值运算符 |= 不适用于布尔向量?

Apollo Android (GraphQL) 自定义类型构建文件警告:“无法为最终字段赋值”

golang坑集-单例模式

mvc 个别字段无法赋值的问题