2017-09-12 14 views
1

我有接受指針的指針param的方法:現在目標C指向指針 - 如何傳遞零相較於未初始化的變量集區分爲nil

+(void)someMethod:(NSString*_Nullable*_Nullable)parsed; 

,如果我調用此方法,並通過「無「作爲參數,然後我做裏面的解除引用,如:

*parsed = soemthing; 

我得到崩潰壞的訪問。現在的問題是,如何構建條件來區分通過「無」與傳遞不initilized變量,如:

NSString* s; // this is technically nil too, but dereference works and doesn't crash 
[someObj someMethod:&s]; 

,以防止在第一種情況中提到的崩潰。

回答

2

該解決方案相對簡單,您不應該傳遞一個未初始化的變量。考慮這樣做:

NSString *s = nil; 
[someObj someMethod:&s]; 

注意,你已經宣佈&小號的someMethod需要一個NSString的**。通過執行& s解析將始終被定義,因爲變量顯然存儲在內存中的某處。它存儲在* parsed的值將被初始化爲零。然後,您應該可以執行如下操作:

+(void)someMethod:(NSString* _Nullable *_Nullable)parsed { 
    if(NULL != parsed) { 
     if(nil == *parsed) { 
      *parsed = @"Our variable *s will now be set!"; 
     } 
    } 
} 

享受!

+1

嗨,謝謝你的回覆。現在我看到解決方案可能比我想象的更容易。如果(解析)條件應該足以檢查問題,因爲解析的是該指針在內存中的地址,並且在將指針(偶數)傳遞給未初始化變量的情況下地址不爲空。 – luky

+1

嚴格地說,第一個測試應該是'NULL'而不是'nil'。後者僅適用於對象類型。第二個指針本身不是一個對象。 –

+0

@JoshCaswell謝謝,我更新了代碼以反映這一點。儘管我還沒有看到一個平臺,其中NULL和nil都不是都用數值0表示,但您應該將nil用於對象指針,將NULL用於內存指針,這是正確的。 – ekscrypto