簡體   English   中英

Obj-C setValuesForKeysWithDictionary 64位與32位

[英]Obj-C setValuesForKeysWithDictionary 64-bit vs 32-bit

我正在從我的API中提取一個JSON對象,並使用以下代碼創建該對象(事后看來並非如此):

+ (YActivity *)instanceFromDictionary:(NSDictionary *)jsonDictionary
{
    YActivity * instance = [[YActivity alloc] init];
    [instance setAttributesFromDictionary:jsonDictionary];
    return instance;
}

- (void)setAttributesFromDictionary:(NSDictionary *)jsonDictionary
    {
        if (![jsonDictionary isKindOfClass:[NSDictionary class]]) {
            return;
        }

        [self setValuesForKeysWithDictionary:jsonDictionary];
}

鍵之一是“類型”。 我有一個名為“ type”的只讀變量@synthesized。 在我的應用程序的32位版本上,此設置在setValue:(id)value forUndefinedKey:(NSString *)key之前立即設置。 我在該方法中引用此值,並且在我的應用程序的64位版本上,當斷點命中該方法時,尚未設置類型。

顯然,這不是最佳的做法。 我只是想知道是否有人看到過這種情況,或者我在吠錯樹。 我在兩個版本之間比較了文件,它們是相同的。 我都在iOS 8.1 Simulator上運行它們,API兩者都返回相同的東西...我很困惑。 基本上,在舊版本中,已定義鍵是在未定義之前設置的,而在新版本中,這似乎是相反的。

NSDictionary對象是無序集合,因此代碼絕不應該假設字典枚舉其自身鍵的順序。 事實證明,在32位和64位運行時之間存在實現差異,這些差異會影響哈希值最終存儲在何處。

由於API合約明確地不保證順序,因此不會引起問題,但是它(在這種情況下顯然) 確實具有副作用,導致在為64-位架構。

解決當前存在的問題而又不顯着更改實現的一種快速方法是自己枚舉字典的鍵,這將使您能夠提供所需順序的鍵數組:

- (void)setAttributesFromDictionary:(NSDictionary *)dictionary
{
    // So instead of doing this...
    //
    // [self setValuesForKeysWithDictionary:dictionary];

    // You could do something along these lines:
    //
    NSMutableArray *keys = dictionary.allKeys.mutableCopy;

    // TODO: insert code to change the order of the keys array.
    // Then loop through the keys yourself...

    for (NSString *key in keys)
    {
        [self setValue:dictionary[key] forKey:key];
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM