2015-07-03 34 views
1

我想知道如何使用NSSecureCoding當編碼時給定的屬性是nil。看看下面的例子:- initWithCoder:當-decodeObjectOfClass:forKey:返回零

- (instancetype)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super init]; 

    if (self) { 

     _buffer = [aDecoder decodeObjectOfClass:[NSMutableData class] forKey:@"buffer"]; 

     if (_buffer == nil) { 
      self = nil; 
     } 
    } 

    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    [aCoder setValue:_buffer forKey:@"buffer"]; 
} 

我創建設置self的習慣nil每當分配失敗,因爲它似乎是一個正確的模式。但是,在這種情況下,如果_buffer的編碼是nil,那麼在解碼時如何判斷分配失敗?

+0

我不認爲你應該自我設置爲零。您創建該對象,其中一個屬性爲零。那有什麼問題? –

+0

這是錯誤的,因爲它沒有被正確初始化。例如,可以說我正在用數據初始化('-initWithData:')。在某些時候,我會複製數據('_buffer = [NSMutableData dataWithData:data]')。如果此後'_buffer'爲'nil'(分配失敗),則該對象尚未正確初始化。你不應該像沒有任何事情那樣返回「自我」,因爲發生了一些事情。通過返回'self'(非'nil'),你會告訴調用者一切都會好起來的,事實並非如此。 –

回答

2

我不確定你想要在這裏處理的模式,但直接在編碼器上使用setValue:我懷疑是奇怪的。我只用過,看過,使用的語法爲encode<SomeThing>: forKey:。而從我看到的情況來看,然後嘗試解碼相同的密鑰會導致錯誤的輸出。

但是你說你想要區分實際爲空的結果解碼和你選擇返回空值的失敗狀態?我仍然不確定你爲什麼要這樣處理,但區分的唯一方法是選擇一個不同的值來存儲,如「緩衝區沒有值」,然後在解碼時檢查該字符串,或存儲第二個關鍵的編碼器,你會檢查:

if(_buffer == nil){ 
    [aCoder encodeBool: true forKey: @"wasBufferNull"]; 
} 
+0

你是對的!我甚至沒有注意到我正在使用'-setValue:forKey:'。當然,我通常使用'-encodeObject:forKey:'。編碼第二個密鑰是個不錯的主意。儘管如此,'NSCoder'不能處理這個問題有點不幸。在接受之前我會多給幾次,以防萬一有更好的選擇,有人迴應。謝謝! –