68

null 値の配列を取得しています。以下の配列の構造を確認してください。

 (
    "< null>"
 )

インデックス 0 にアクセスしようとすると、次の理由でクラッシュします。

-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x389cea70

現在、そのアレイが原因でクラッシュ ログがクラッシュしています。

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x389cea70'
*** First throw call stack:
(0x2d9fdf53 0x3820a6af 0x2da018e7 0x2da001d3 0x2d94f598 0x1dee57 0x1dfd31 0x302f598d 0x301a03e3 0x3052aeed 0x3016728b 0x301659d3 0x3019ec41 0x3019e5e7 0x30173a25 0x30172221 0x2d9c918b 0x2d9c865b 0x2d9c6e4f 0x2d931ce7 0x2d931acb 0x3262c283 0x301d3a41 0xabb71 0xabaf8)
libc++abi.dylib: terminating with uncaught exception of type NSException
4

9 に答える 9

124
id object = myArray[0];// similar to [myArray objectAtIndex:0]

if(![object isEqual:[NSNull null]])
{
    //do something if object is not equals to [NSNull null]
}
于 2013-09-27T20:17:33.560 に答える
30
if (myArray != (id)[NSNull null])

また

if(![myArray isKindOfClass:[NSNull class]]) 
于 2013-09-27T20:18:24.373 に答える
14

トニの答えから構築して、マクロを作成しました。

#define isNSNull(value) [value isKindOfClass:[NSNull class]]

それからそれを使用する

if (isNSNull(dict[@"key"])) ...
于 2014-04-22T15:37:01.007 に答える
7

NSNull作業用のコードに次の問題があることがわかりました。

  • うるさくて醜く見えます。
  • 時間がかかる。
  • エラーを起こしやすい。

そこで、次のカテゴリを作成しました。

@interface NSObject (NSNullUnwrapping)

/**
* Unwraps NSNull to nil, if the object is NSNull, otherwise returns the object.
*/
- (id)zz_valueOrNil;

@end

実装では:

@implementation NSObject (NSNullUnwrapping)

- (id)zz_valueOrNil
{
    return self;
}

@end

@implementation NSNull (NSNullUnwrapping)

- (id)zz_valueOrNil
{
    return nil;
}

@end

次の規則に従って動作します。

  • カテゴリが同じものに対して 2 回宣言された場合Class(つまり、型のシングルトン インスタンスClass)、動作は未定義です。ただし、サブクラスで宣言されたメソッドは、そのスーパークラスのカテゴリ メソッドをオーバーライドできます。

これにより、より簡潔なコードが可能になります。

[site setValue:[resultSet[@"main_contact"] zz_valueOrNil] forKey:@"mainContact"];

. . チェックする余分な行があるのとは対照的ですNSNull。接頭辞はzz_少し見栄えが悪いですが、名前空間の衝突を避けるための安全のためにあります。

于 2015-04-17T06:49:19.763 に答える