我遇到了一个愚蠢的问题,我几乎尝试了所有东西(买了 3 本书,浏览了整个谷歌 :))但没有任何帮助。在我看来,解决方案应该非常简单......
我需要在 Objective-C 中声明一个单例(对于 iOS 应用程序,如果这很重要的话),它应该有一些我需要从其他类更新的属性。但我不能这样做 - 属性不会更新,它们在“init”方法中设置了相同的值。
我创建了一个简单的应用程序来测试这个问题。这就是我所做的:
首先,我声明了一个示例类及其子类,我将用作单例的属性:
@interface Entity : NSObject
@property (nonatomic, strong, readwrite) NSMutableString * name;
@end
@implementation Entity
@synthesize name;
@end
@interface Company : Entity
@property (nonatomic, strong, readwrite) NSMutableString * boss;
@property (nonatomic) int rating;
@end
@implementation Company
@synthesize boss, rating;
@end
然后我根据“iOS Programming Guide by Big Nerd Ranch”一书中描述的方法声明了单例本身。为了清楚起见,我同时使用我的自定义类和标准 NSMutableString 作为属性:
@class Company;
@interface CompanyStore : NSObject
{
NSMutableString * someName;
}
@property (nonatomic, strong, readwrite) Company * someCompany;
@property (nonatomic, strong, readwrite) NSMutableString * someName;
+ (CompanyStore *) store;
- (void) modifyCompanyProperties;
@end
@implementation CompanyStore
@synthesize someCompany, someName;
// Declaring the shared instance
+ (CompanyStore *) store
{
static CompanyStore * storeVar = nil;
if (!storeVar) storeVar = [[super allocWithZone:nil] init];
return storeVar;
}
// Replacing the standard allocWithZone method
+ (id) allocWithZone:(NSZone *)zone
{
return [self store];
}
然后我用初始值初始化所有属性:
- (id) init
{
self = [super init];
if (self) {
someCompany = [[Company alloc] init];
[someCompany setBoss:[NSMutableString stringWithFormat:@"John Smith"]];
[someCompany setName:[NSMutableString stringWithFormat:@"Megasoft"]];
[someCompany setRating:50];
someName = [[NSMutableString alloc] initWithString:@"Bobby"];
}
return self;
}
从另一个类(在视图中显示内容的视图控制器):
1.我得到了单例属性的值。一切都好——我的 int 值得到了“John Smith”、“Megasoft”、“Bobby”和 50。我的init方法中的值。
2.我从该视图控制器更改单例的属性(使用多种方式 - 我现在不确定哪一种是正确的):
- (IBAction)modify2Button:(id)sender {
CompanyStore * cst = [CompanyStore store];
NSMutableString * name = [[NSMutableString alloc] initWithString:@"Microcompany"];
NSMutableString * boss = [[NSMutableString alloc] initWithString:@"Larry"];
[[[CompanyStore store] someCompany] setName:name];
cst.someCompany.boss = boss;
NSMutableString * strng = [[NSMutableString alloc] initWithString:@"Johnny"];
[cst setSomeName:strng];
}
...然后我试图再次获得这些值。我仍然得到旧的集合 - “John Smith”,“Megasoft”等,即使当我在其中一个字符串上设置断点时,我可以看到单例的 name 属性是“Microcompany”而不是“Megasoft”休息时间……不过好像没有分配。
3.然后我在尝试另一件事——我从视图控制器调用一个单例的私有方法,它为属性分配另一组值。这是单例中的方法:
- (void) modifyCompanyProperties
{
NSMutableString * boss = [[NSMutableString alloc] initWithString:@"George"];
NSMutableString * name = [[NSMutableString alloc] initWithString:@"Georgeland"];
[someCompany setBoss:boss];
[someCompany setName:name];
[someCompany setRating:100000];
[someName setString:@"Nicholas"];
}
4.我试图再次从视图控制器中获取更新的属性值......仍然得到那些“John Smith”、“Megasoft”......没有任何变化。
似乎单例的属性只设置了一次,然后我无法更改它们,即使它们的属性被声明为“读写”。
看起来我不明白一些简单的事情。如果有人能解释如何正确声明和更新单例中的属性,我将不胜感激。