5

変数を に初期化することをお勧めしますnilか?

プロジェクトでアナライザーを実行すると警告が表示されるため、私はそれを求めています。

 NSString *q;

    if(sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK)
    {
        sqlite3_step(statement);
        selectedQuestion =[NSString stringWithFormat: @"%s",(char *)sqlite3_column_text(statement, 0)];
        sqlite3_finalize(statement);
    }

    sqlite3_close(database);

    return q; //Undefined or garbage value returned to caller

コードを変更すると、警告はなくなりました。

NSString *q = nil;
4

4 に答える 4

11

ARC を使用している場合、ポインタは自動的に nil に割り当てられます。ただし、ポインターにガベージ値が含まれる場合、ARCを使用しているとは思いません。関数を呼び出した人は誰でも結果を受け取り、ポインターが nil と等しくないため有効なものを指していると信じる可能性があるため、これは危険です。

だから...はい、常にポインタをnilまたは有効な値に初期化してください。

例 1 :: 最初に nil を代入する必要がない良い例:

UIViewController *myVC = [[[UIViewController] alloc] init] autorelease];

例 2 :: 最初に nil を代入する必要がない悪い例:

UIViewController *myVC = nil;  // dumb since next line assigns it to valid value
myVC = [[[UIViewController] alloc] init] autorelease];

例 3 :: 条件付きで新しい値を取得するため、nil に代入する良い例

UIViewController *myVC = nil;  // :D
if (someCondition)
{
   myVC = [[[UIViewController] alloc] init] autorelease];
}
...
于 2012-02-09T17:43:31.453 に答える
5

はい。q が nil に初期化されていない場合、ランダムな値になり、後の実行で隠れたバグが発生する可能性があります。

于 2012-02-09T17:26:28.283 に答える
0

変数を使用する前に、定義済みの値を設定することをお勧めします。そうしないと、あらゆる種類の問題が発生します。残りは、使用しているツールに大きく依存します。

優れたコンパイラは、使用する前に定義されていない変数を使用しているかどうか、または使用する前に定義されていることをコンパイラが証明できない場合に通知します。悪いコンパイラ (または、ツールの適切な使用方法を知らない開発者が使用する優れたコンパイラ) は、それを行いません。優れたコンパイラでは、nil または NULL への初期化により、コンパイラが適切に機能しなくなる可能性があります。nil ではないが正しくない NSString をコードで返す必要がある場合の例を考えてみましょう。

NSString* result;
if (condition) result = @"True";
else if (otherCondition) result = @"False";
return result;

ここで、未定義の結果が返される可能性があるため、コンパイラは警告を表示できます。結果を nil に初期化すると、nil を返すはずのない関数で nil を返す可能性があるという同じ問題が残りますが、コンパイラは警告できません。

一方、値が nil でなければならない場合、または nil が許容値であり、場合によっては変数を別の値に設定しない予定の場合は、nil に初期化することは問題なく、良い方法です。

概要: 初期化されていない変数を使用しているかどうかを知らせるように、コンパイラを使用して適切に設定します。初期化されていない変数に関する警告が表示された場合は、警告ではなく問題を修正してください。

于 2014-07-15T12:47:51.303 に答える
0

はい、まったく問題ありません。nil は、この変数がメモリ内の何も指していないことを示す別の方法です。

于 2012-02-09T17:24:37.873 に答える