NSDictionary不会改变

时间:2014-05-27 13:34:49

标签: ios objective-c object static nsdictionary

我想让自己变得更容易,所以我创建了一个由其他函数使用的字典(按对象或对象按键访问键),但该字典始终是静态的。这是一个很好的方式,或者我需要财产或其他什么?

+ (NSDictionary *)dictionaryWithCategoriesAndStrings
{
    return @{
             kNewsCategoryAll       : @(NewsCategoryAll),
             kNewsCategoryRadio     : @(NewsCategoryRadio),
             kNewsCategoryEconomics : @(NewsCategoryEconomics),
             kNewsCategoryCulture   : @(NewsCategoryCulture),
             kNewsCategorySport     : @(NewsCategorySport),
             kNewsCategoryTravel    : @(NewsCategoryTravel),
             kNewsCategoryMusic     : @(NewsCategoryMusic),
             kNewsCategorySociety   : @(NewsCategorySociety),
             kNewsCategoryHealth    : @(NewsCategoryHealth)
             };
}

所以现在我总是通过函数[self dictionaryWithCategoriesAndString]访问这个相同的字典;

注意:键是在顶部声明的静态字符串,对象是带整数的NSNumbers。

3 个答案:

答案 0 :(得分:5)

您可以在方法中创建静态,而不是将静态暴露给整个类,而只使用gcd初始化它一次:

线程安全。

+ (NSDictionary *)dictionaryWithCategoriesAndStrings {
    static NSDictionary *dict;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        dict = @{
                 kNewsCategoryAll       : @(NewsCategoryAll),
                 kNewsCategoryRadio     : @(NewsCategoryRadio),
                 kNewsCategoryEconomics : @(NewsCategoryEconomics),
                 kNewsCategoryCulture   : @(NewsCategoryCulture),
                 kNewsCategorySport     : @(NewsCategorySport),
                 kNewsCategoryTravel    : @(NewsCategoryTravel),
                 kNewsCategoryMusic     : @(NewsCategoryMusic),
                 kNewsCategorySociety   : @(NewsCategorySociety),
                 kNewsCategoryHealth    : @(NewsCategoryHealth)
                 };
    });

    return dict;
}

答案 1 :(得分:1)

每次调用此方法时,您都将创建一个新的NSDictionary,因此您不会真正访问相同的字典,因为每次只会是一个新的相同字典。如果您静态使用它,您将无法创建属性。也许更像这样的东西,所以你每次都要访问同一个字典。

要在实例方法中访问它,可以使用[[self class] dictionaryWithCategoriesAndStrings]。

static NSDictionary* dict;


+ (NSDictionary *)dictionaryWithCategoriesAndStrings
{
    if(dict == nil)
    {
        dict = @{
         kNewsCategoryAll       : @(NewsCategoryAll),
         kNewsCategoryRadio     : @(NewsCategoryRadio),
         kNewsCategoryEconomics : @(NewsCategoryEconomics),
         kNewsCategoryCulture   : @(NewsCategoryCulture),
         kNewsCategorySport     : @(NewsCategorySport),
         kNewsCategoryTravel    : @(NewsCategoryTravel),
         kNewsCategoryMusic     : @(NewsCategoryMusic),
         kNewsCategorySociety   : @(NewsCategorySociety),
         kNewsCategoryHealth    : @(NewsCategoryHealth)
         };
    }
    return dict;
}

答案 2 :(得分:-1)

几乎是正确的。每次执行该选择器时,都会创建一个新的NSDictionary。那很不好。它应该只创建一次,它应该只是懒惰地创建。

@property (strong, nonatomic) NSDictionary *categoryDict;

- (NSDictionary *) categoryDict
{
    if( !_categoryDict)
    { 
       _categoryDict = @{  @"Key" :@"value" , ....};
    }
    return _categoryDict;
}

现在字典只创建一次。你可以用点符号来到词典。