3

iPhone 6、iOS 8.3 で奇妙な動作に遭遇しました。

appVersion は、渡される NSString* パラメータです。

  NSLog(@"A:%@:%d",appVersion,(int)appVersion.length);
  if (!appVersion)
    NSLog(@"a");
  if (appVersion == 0)
    NSLog(@"b");
  if (appVersion == nil)
    NSLog(@"c");
  if (appVersion == NULL)
    NSLog(@"d");
  if (appVersion == Nil)
    NSLog(@"e");
  if ([appVersion isEqual:[NSNull null]])
    NSLog(@"f");

  NSString* av = [NSString stringWithFormat:@"%@",appVersion];
  if ([av isEqualToString:@"(null)"])
    NSLog(@"g");
  if (((int)appVersion) == 0)
    NSLog(@"h");

  if (appVersion) {
    NSLog(@"B:%@:%d",appVersion,(int)appVersion);
    params[@"appversion"] = appVersion;
  }

アプリのリリース ビルドは次を返します。

A:(null):0
g
h
B:(null):0

そしてクラッシュします(「オブジェクトはnilにすることはできません(キー:appversion)」)。

デバッグ ビルドは次を返します。

a
b
c
d
e
g
h

nil ではなく nil とは何ですか?

4

3 に答える 3

3

私はいくつかのレガシー コードで作業していますが、.h ファイルと .m ファイルのメソッド シグネチャに違いがあることに気付きませんでした。

.h ファイルには次のものがあります。

- (void) verifyWinner:(NSString*)baseAcctId
           appVersion:(NSString*)appVersion
           onComplete:(OnCompleteWinnerVerifier)onComplete __attribute__((nonnull));

元の開発者は、onComplete が nil に設定されるのを防ぎたかったのだと思います。ただし、何らかの理由__attribute__((nonnull))で各パラメーターに関連付けられています。

タグが原因で__attribute__、XCode はリリース ビルドのすべての != nil チェックを最適化し、クラッシュを引き起こします。

この問題は、XCode 6.3 で発生したばかりです。そのため、おそらく Apple は最近最適化を追加したか、6.3 でバグを導入して、__attribute__隣にあるパラメーターだけでなく、各パラメーターに関連付けました (とにかく最適化の目的で)。

于 2015-04-18T19:34:48.883 に答える
0

[NSNull null] を確認します

NSNull クラスは、nil が値として禁止されている状況 (通常は、配列や辞書などのコレクション オブジェクト) で null 値を表すために使用するシングルトン オブジェクトを定義します。

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/NumbersandValues/Articles/Null.html

于 2015-04-18T18:10:18.563 に答える