2016-03-28 11 views
3

Objective-Cの最近のバージョンでは、NULL値の注釈をポインタに追加して、いつでもできることとできないことを指定することができます。nilつまり、この法律上のような構文になります:null以外のメソッドの引数にnilを渡す

-(void)doSomething:(nonnull NSString *)param; 

これはparamnilしてはいけませんコンパイラに指示します。しかし、それを渡すことは誤りではありませんnil。私のAPIでは、nilが渡されたときに私のメソッドが正常な動作をすることを確認するためにテストしています。しかし、私が気づいているのは、に合格すると、nonnullとマークされたパラメータは自動的にその型の空のインスタンスに変換されます。私はこのように上記の例を呼び出した場合たとえば、:

[self doSomething:nil]; 

param私が期待するように、空のメソッド内の文字列、およびないnilだろう。これは文書化され、意図された動作ですか?もしそうなら、まだそれをnilとして扱う方法があるので、私はそれをより効果的に扱うことができますか?

+1

私はちょうどテストしましたが、私はあなたが記述した動作を見ません。空の文字列を与えるために 'doSomething:'メソッドで何かしています。 – Avi

+0

奇妙なことに、私のマシン(Public Xcode 7.3、OS X 10.11.4、iOS sim iPhone 6s Plus iOS 9.3)では、次のようになります: - (void)doSomething:(NSString *)param { NSLog(@ "%@" NSStringFromClass([param class])); '__NSCFConstantString'(これは基本的に' NSString'です)と書いてあります。 –

+0

私は一致するように私のサンプルを修正しました。 'NSLog()'ステートメントによって出力される文字列は、 'nil'を渡しているので、'(null) 'です。 – Avi

答えて

0
まだ

ない、本当に(それは別のシステムで再現性のない場合は特に)何が起こっていたかを確認しますが、標準はDerivedDataを削除し、クリーンなビルドが何らかの理由

1

のためにあなたが

を呼び出すことができ、問題を解決するように見えました
[self doSomething:[NSNull null]]; 

あなたは

-(void)doSomething:(nonnull id)param; 

を持っている場合、そうしないと、呼び出す必要があり

[self doSomething:@""]; 
+0

それはOPが求めているものではありません。彼は、コンパイラが 'nil'を' @ "' 'に変換することが意図された動作であるかどうかを知りたがっています。 – trojanfoe

関連する問題