2

アプリでエラーが発生しました。修正しようとすると、メソッドをデバッグしたときに非常に奇妙な動作が発生しました。

次のコードを確認してください:(testStringNSString

NSLog(@"logging:AAAA%@AAAA",[testObject testString]);

if ([[testObject testString] isEqualToString:@"(null)"]) {
    NSLog(@"yeah im here!");
}

とその印刷:

logging:AAAA(null)AAAA

しかし、それは「ええ、ここにいます!」には決して達しません。そんなことがあるものか?

4

6 に答える 6

3

の出力はtestStringですnil

NSLogは、nilオブジェクトが渡されると「(null)」を生成します。isEqualToStringただし、nilオブジェクトでメソッド(のような)を呼び出すと、nil再び評価され、「if」ではfalseと評価されます。

于 2012-09-03T14:07:01.397 に答える
2

NSLogは、常にオブジェクトの説明を出力します。

実際、それはNS_FORMAT_FUNCTIONです。

FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);

それで:

NSString *stringForNSLog = [NSString stringWithFormat:@"%@",[testObject testString]];

*stringForNSLog正確には「(null)」である必要があります。

ただし、testStringの値はnilです。

AppleのCocoaのオープンソース実装であるGNUStepを調べていると、次のようなものが見つかります。

すべての文字列形式のものはで書かれていますGSFormat.m

とでGSFormat.m

size_t len;
id obj;
NSString *dsc;

obj = args_value[specs[nspecs_done].data_arg].pa_object;

if (!obj) dsc = @"(null)";
else if ([obj respondsToSelector: @selector(descriptionWithLocale:)]) dsc = [obj descriptionWithLocale: locale];
else dsc = [obj description];

http://svn.gna.org/svn/gnustep/libs/base/trunk/Source/NSString.m

http://svn.gna.org/svn/gnustep/libs/base/trunk/Source/GSFormat.m

于 2012-09-03T14:36:51.273 に答える
1

testStringメソッドはnilを返し、nilでメソッドを呼び出しても何も起こらないためです。

于 2012-09-03T14:11:59.480 に答える
0

NSLog(null)がの場合、リテラルを出力しNSStringますnil。テストを次のように変更します。

if ([[testObject testString] == nil)
于 2012-09-03T14:07:03.480 に答える
0

testObject自体がnilであるためです。

あなたはテストすることができます:

if ((testObject==nil)||([[testObject testString] isEqualToString:@"(null)"])) {
    NSLog(@"yeah im here!");
}
于 2012-09-03T14:07:16.077 に答える
0
if ((testObject==nil)||([[testObject testString] isEqualToString:@"(null)"])) {
    NSLog(@"yeah im here!");
}
于 2012-09-04T18:29:14.577 に答える