1

尝试创建一个名为“Person”的 NSObject,它将保存我的应用程序的登录详细信息(没什么可看的)。该应用程序由具有多个表视图的导航控制器组成,但我在共享 Person 对象时遇到问题。

试图创建一个像这样的静态对象:

+ (Person *)sharedInstance {
    static Person *sharedInstance;
    @synchronized(self) {
        if(!sharedInstance)
            sharedInstance = [[Person alloc] init];
        return sharedInstance;
    }
    return nil;
}

这是标题

// Person.h
#import <Foundation/Foundation.h>

@interface Person : NSObject {

    NSString    *fullName;
    NSString    *firstName;
    NSString    *lastName;
    NSString    *mobileNumber;
    NSString    *userPassword;
}

@property(nonatomic, retain) NSString   *fullName;
@property(nonatomic, retain) NSString   *firstName;
@property(nonatomic, retain) NSString   *lastName;
@property(nonatomic, retain) NSString   *mobileNumber;
@property(nonatomic, retain) NSString   *userPassword;

+ (Person *)sharedInstance;
-(BOOL) setName:(NSString*) fname;
-(BOOL) setMob:(NSString*) mnum;
-(BOOL) setPass:(NSString*) pwd;

@end

应用程序的不同部分需要此对象设置器和获取器。我一直在尝试像这样访问它们

Person * ThePerson = [[Person alloc] init];
ThePerson = nil;
NSString * PersonsName;
PersonsName = [[Person sharedInstance] firstName];

在登录屏幕上一切正常,但在下次使用时会死机。通常是 EXC_BAD_ACCESS(哎呀!)。

显然我在这里做错了什么。有没有更简单的方法在不同的数字视图控制器(编码和 xib)之间共享对象?

4

4 回答 4

3

为什么不将此信息存储在NSUserDefaults或钥匙串中?

于 2010-03-08T15:04:57.403 回答
2

您的+sharedInstance方法nil在应该返回共享实例时返回。另外,我怀疑在该块上同步是否有任何价值。该方法可以写得更简单:

+ (Person *)sharedInstance {
    static Person *sharedInstance;
    if(!sharedInstance) {
        sharedInstance = [[Person alloc] init];
    }
    return sharedInstance;
}

请注意,这不会创建“静态对象”,因为在 Objective-C 中没有这样的东西;它只是将一个对象分配给一个静态变量(可能是您的意思,但只是想确定一下)。

在导航控制器中的两个或多个视图控制器之间共享对象的另一种方法是向嵌套的视图控制器添加一个属性,并在导航之前调用 setter 方法。例如,您可以添加如下属性:

@property (nonatomic, retain) Book *book;

到根视图控制器的一个孩子,并在根视图控制器的方法中向它发送一条-setBook:消息。-tableView:didSelectRowAtIndexPath:

于 2010-03-08T15:55:38.473 回答
0

您没有正确使用共享实例模式。您的 sharedInstance 方法应该分配并初始化一个新的 Person (如果尚未完成一次)并将其分配给 sharedInstance 静态变量。

然后当你需要一个人的指针时,你应该使用共享实例类方法,而不是自己分配和初始化一个新实例。

从技术上讲,如果你想要一个完整的单例,你的 alloc 方法不应该允许你创建一个 Person 的新实例。

另外,我刚刚重新阅读了您的代码,并遇到了一些 WTF:

Person * ThePerson = [[Person alloc] init];
ThePerson = nil;

那是怎么回事?那是内存泄漏,就在那里。

您的所有问题都可以通过替换任何和所有行来Person *thePerson = [[Person alloc] init];解决Person *person = [Person sharedInstance];

于 2010-03-08T15:31:26.733 回答
0

你的 init 是 hinky,如果你想设置 Person 的 firstName 这样做

Person *thePerson = [Person sharedInstance];  
thePerson.name = @"John Public";

把名字拿出来,

NSString *personName = [[Person sharedInstance] name];  

这将适用于 #imports "Person.h" 的任何类

于 2010-03-08T15:32:30.583 回答