2

デバイス (iPhone iOS 4.3) で NSRange の動作がおかしい。このコードは、デバイスとシミュレータで異なる動作をします。

for (Location *location in locationArray)
{
    NSRange range1 = [location.name rangeOfString:searchText options:NSCaseInsensitiveSearch];
    NSRange range2 = [location.streetAddress rangeOfString:searchText options:NSCaseInsensitiveSearch];
    NSRange range3 = [location.postalCode rangeOfString:searchText options:NSCaseInsensitiveSearch];

if (range.length1 > 0 | range2.length > 0 | range3.length > 0)
    [self.filteredList addObject:location];
}

一部のプロパティの値が nil の場合、そのプロパティの range.length は、デバイスでは 2、シミュレータでは 0 になります。

私は何か間違ったことをしていますか?

4

1 に答える 1

1

Objective-C プログラミング言語

メッセージから nil に返される値も有効な場合があります。

  • メソッドがオブジェクトを返す場合、nil に送信されたメッセージは 0 (nil) を返します。例: Person *motherInLaw = [[aPerson配偶者] 母]; ここで配偶者オブジェクトが nil の場合、mother は nil に送られ、メソッドは nil を返します。
  • メソッドがポインタ型、サイズが sizeof(void*) 以下の整数スカラー、float、double、long double、または long long を返す場合、nil に送信されたメッセージは 0 を返します。
  • メソッドが構造体を返す場合 (Mac OS X ABI Function Call Guide でレジスタに返されるように定義されている)、nil に送信されるメッセージは、構造体のすべてのフィールドに対して 0.0 を返します。他の構造体データ型はゼロで埋められません
  • メソッドが前述の値の型以外を返す場合、nil に送信されるメッセージの戻り値は未定義です。

これは Mac OS X 用ですが、メッセージ ターゲットが nil の場合、返された構造体の値に依存すべきではないと言っても過言ではありません。

于 2011-03-11T20:11:21.173 に答える