2012-02-08 83 views
20

以下是我的.h文件中:初始化的NSDictionary

NSDictionary *originalValues; 
    @property (nonatomic, retain) NSDictionary *originalValues; 

這是.m文件給init的NSDictionary。

@synthesize originalValues; 

- (void)viewDidLoad { 

// copy original values when view loaded 
originalValues = [[NSDictionary alloc] initWithObjectsAndKeys:place.city, @"city", place.cuisine, @"cuisine", 
       place.latitude, @"latitude", place.longitude, @"longitude", place.name, @"name", place.rating, 
       @"rating", place.state, @"state", place.street, @"street", place.telephone, @"telephone", 
       place.timesVisited, @"times visited", place.uppercaseFirstLetterOfName, @"first letter", 
       place.website, @"website", place.zipcode, @"zipcode", nil]; 
} 

問題是隻有前四個對象和鍵被添加。之後,他們不會被添加到以place.name,@「name」開頭的字典中。我在整個詞典上做了一個NSLog,唯一輸出的東西就是我提到的前四個值,所以後來我在place.name上做了一個NSLog,它輸出一個值,所以我知道還應該爲這個鍵/值輸出一些東西對。有什麼我在這裏失蹤?我很好奇爲什麼所有的值都沒有被初始添加到NSDictionary中?

回答

43

他們沒有被添加的原因是因爲一個對象是零,它標記字典的結尾。您需要確保每個對象不是nil,如果是,則可以使用[NSNull null]代替它。同樣使用self.originalValues = ...進行正確的內存管理。只要確保曾經使用字典檢查/可以處理NSNull值。

示例使用gnu ternary extension

self.originalValues = [[NSDictionary alloc] initWithObjectsAndKeys: 
         place.city ?: [NSNull null], @"city", 
         place.cuisine ?: [NSNull null], @"cuisine", 
         place.latitude ?: [NSNull null], @"latitude", 
         place.longitude ?: [NSNull null], @"longitude", 
         place.name ?: [NSNull null], @"name", 
         place.rating ?: [NSNull null], @"rating", 
         place.state ?: [NSNull null], @"state", 
         place.street ?: [NSNull null], @"street", 
         place.telephone ?: [NSNull null], @"telephone", 
         place.timesVisited ?: [NSNull null], @"times visited", 
         place.uppercaseFirstLetterOfName ?: [NSNull null], @"first letter", 
         place.website ?: [NSNull null], @"website", 
         place.zipcode ?: [NSNull null], @"zipcode", 
         nil]; 
+2

@TReddy我在所有的C和C++編碼中避免了這個三元表達式。但是因爲這是Objective-C,通常只使用gcc或Apple的llvm編譯,所以我發現使用它沒有問題。 – Joe 2012-02-08 15:07:16

54

如果對象之一是nil,你可以趕上得更快,如果你使用新的文字語法用於初始化NSDictionary(如下圖)。這種語法不僅更短,而且更穩健:如果其中一個對象是nil,那麼實際上會得到運行時錯誤,而不是以不完整的數據靜默地繼續執行。

originalValues = @{ @"city"  : place.city, 
        @"latitude" : place.latitude, 
        // etc. 
        }; 
+0

雖然字面語法更好,更偏好,但我不確定當一個值爲'nil'時,OP正在尋找運行時錯誤。 – Joe 2015-03-17 12:45:40

0

爲了避免在任何字典意外零最好的解決辦法是,如果你結合使用文字和三元運營商像

self.originalValues = @{ @"city" : (place.city ?: @"city"), 
         @"latitude" : (place.latitude ?: [NSNull null]), 
         // etc. 
         }; 

注意兩個工藝:

(anyValueOrVariable?:@「anyOtherValueOrVariable」)

是縮寫,意思與

(anyValueOrVariable!= 0)相同? anyValueOrVariable: @「anyOtherValueOrVariable」