在Singleton中设置NSString的正确方法?

时间:2011-07-22 20:50:39

标签: objective-c singleton

在我的“用户”单例中,我有以下方法:

- (void)updateUser:(NSDictionary*)userInfo
{
    //uid, fullname, email are ivars
    [uid release];
    uid = [[NSString alloc] initWithString:[userInfo objectForKey:@"id"]];
    [fullName release];
    fullName = [[NSString alloc] initWithFormat:@"%@ %@", [userInfo objectForKey:@"fname"], [userInfo objectForKey:@"lname"]];
    [email release];
    email = [[NSString alloc] initWithString:[userInfo objectForKey:@"email"]];
}

这是设置NSStrings的正确方法吗?我尝试使用自动释放对象,但它们似乎发布得太早。

编辑: 没关系我是傻瓜。完全忘记了NSMutableStrings

1 个答案:

答案 0 :(得分:2)

您没有提供太多信息,但这实际上就是您创建NSString对象并将它们分配给您的单例中可能的实例变量的方式。您可能需要注意的是,在为变量分配新对象之前,您要释放旧对象。如果在发布和赋值之间访问了该变量,那么某些东西可能会非常糟糕。除非您必须在2.0之前支持Objective-C,否则我建议使用合成属性,因为它们可以安全地处理这些内存问题。

自动释放对象基本上意味着该对象稍后会自动释放。您可以在分配对象但无法自行释放对象的情况下使用自动释放,例如在这样的便利分配方法中:

+ (id)newObject
{
    return [[[MyClass alloc] init] autorelease];
}

内存管理指南说,分配(或保留)对象的人也应该在不再需要访问该对象时释放它。因此,autorelease允许方法返回新创建的对象,并说它不再需要它。如果需要它留在身边,呼叫者必须保留它。如果没有,它将在调用者超出范围后自动释放。