gpt4 book ai didi

iphone - Objective-C静态字段问题

转载 作者:行者123 更新时间:2023-12-01 17:21:43 25 4
gpt4 key购买 nike

我创建了一个小类,可以从plist文件中加载字典项。 getSettingForKey方法在我第一次调用静态方法时起作用,但是在多次调用之后,字典针对具有与先前调用相同的键的调用抛出SIGABRT异常。有任何想法吗?

static NSDictionary *dictionary = nil;
static NSLock *dictionaryLock;

@implementation ApplicationSettingsHelper

+ (void) initialize
{
dictionaryLock = [[NSLock alloc] init];

// Read plist from application bundle.
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"Xxxx.plist"];
dictionary = [NSDictionary dictionaryWithContentsOfFile:finalPath];

// dump the contents of the dictionary to the console.
for(id key in dictionary)
{
NSLog(@"bundle: key=%@, value=%@", key, [dictionary objectForKey:key]);
}
}

+ (NSDictionary *)dictionaryItems
{
[dictionaryLock lock];

if (dictionary == nil)
{
[self initialize];
}

[dictionaryLock unlock];

return dictionary;
}

+(id)getSettingForKey:(NSString *)key
{
return [[self dictionaryItems] objectForKey:key];
}

@end

Moshe-我接受了您的建议,并更新为使用NSUserDefaults:
+ (void)load 
{
// Load the default values for the user defaults
NSString* pathToUserDefaultsValues = [[NSBundle mainBundle]
pathForResource:@"Xxxx"
ofType:@"plist"];

NSDictionary* userDefaultsValues = [NSDictionary dictionaryWithContentsOfFile:pathToUserDefaultsValues];

// Set them in the standard user defaults
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsValues];
}

+ (id)getSettingForKey:(NSString *)key
{
return [[NSUserDefaults standardUserDefaults] valueForKey:key];
}

最佳答案

您的字典可能已被释放,从而导致无效的内存访问。使用dictionaryWithContentsOfFile:方法创建字典时,该字典会自动发布,这意味着将来会自动发布。由于您从不保留字典,因此该发行版将导致释放该字典。

而且,您的大多数dictionaryItems方法都是无用的。

[dictionaryLock lock];
if (dictionary == nil) {
[self initialize];
}
[dictionaryLock unlock];

除非您有 +initialize方法,否则在类上调用任何其他方法之前,运行时会自动调用 +load方法。由于运行时会为您调用它并尝试创建字典,因此如果没有足够的内存来创建字典,则字典只能在 dictionaryItems方法中为nil,在这种情况下它将再次失败。另外,如果您不在其他任何地方使用锁,则也没有必要,因为删除该支票将导致该锁被锁定并立即被解锁。因此,您可以删除锁并将 dictionaryItems方法更改为简单:
+ (NSDictionary *)dictionaryItems {
return dictionary;
}

关于iphone - Objective-C静态字段问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6673477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com