问题使Objective C的持久化对象
-
18-09-2019 - |
题
试图使一个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
需要在应用程序的不同部分该目的setter和getter。我一直在试图访问他们像这样
Person * ThePerson = [[Person alloc] init];
ThePerson = nil;
NSString * PersonsName;
PersonsName = [[Person sharedInstance] firstName];
工作一切良好,在登录屏幕,但它死在下次使用。通常EXC_BAD_ACCESS(EEK!)。
显然,我做什么大错。有共享不同的数视图控制器之间的物体更容易的方法(包括编码和XIB)?
解决方案
为什么不存储在NSUserDefaults
或钥匙串此信息?
其他提示
您+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:
您正在未正确使用共享实例模式。你sharedInstance方法应该alloc和初始化一个新的Person(如果尚未完成一次),并将其分配给sharedInstance静态变量。
然后,当你需要一个指向的人,你应该使用共享的实例类方法,不是alloc和自己初始化一个新的实例。
从技术上讲,如果你去一个完全成熟的单,你的alloc方法不应该让你创建人物的新实例。
另外,我刚才重读你的代码,并横跨有点WTF的传来:
Person * ThePerson = [[Person alloc] init];
ThePerson = nil;
什么是怎么回事?这是一个内存泄漏,就在这里。
所有的问题可以通过用Person *thePerson = [[Person alloc] init];
替换Person *person = [Person sharedInstance];
的任何和所有线路来解决
您的init是hinky,如果你想设置的人的的firstName做这样的
Person *thePerson = [Person sharedInstance];
thePerson.name = @"John Public";
要得到名字出来,
NSString *personName = [[Person sharedInstance] name];
这将在#imports “Person.h” 任何类工作