Saat mendeklarasikan objek di Kakao, haruskah saya menyetelnya ke nihil?

Katakanlah saya ingin membuat instance NSString yang diinisialisasi ke nilai tertentu tergantung pada nilai variabel lain. Biasanya, saya akan melakukannya

NSString *string;
if(foo == 1)
    string = @"Foo is one.";
else
    string = @"Foo is not one.";

Namun, dalam beberapa contoh kode yang saya lihat, saya melihat orang-orang melakukannya

NSString *string = nil;
if(foo == 1)
    string = @"Foo is one.";
else
    string = @"Foo is not one.";

Apa perbedaan keduanya, dan metode mana yang lebih disukai?


person Jordan Kay    schedule 11.08.2009    source sumber


Jawaban (4)


Preferensi pribadi saya adalah menginisialisasi variabel apa pun dengan segera. Namun, dalam sampel yang Anda berikan, kedua metode ini setara.

Dalam bahasa C (yaitu C, C++, Obj-C) variabel yang tidak segera diinisialisasi mungkin berisi nilai sampah acak. Menggunakan variabel sebelum diinisialisasi akan menyebabkan perilaku yang tidak diharapkan (mulai dari yang diharapkan terhenti hingga mendapatkan perilaku yang tidak diharapkan).

Contoh Perhatikan contoh berikut:

int abs;
if (argument > 0) abs = argument;
else if (argument < 0) abs = -1 * argument;
NSLog(@"%i", abs);

Di sini kode membiarkan variabel abs tidak diinisialisasi jika argument adalah 0. Jadi, Anda akan mencatat nilai acak dan kemudian menyebabkan rusaknya nilai di sisa program; dan akan sulit untuk mendeteksi di mana masalahnya!

Jika Anda menggunakan referensi yang tidak diinisialisasi, kemungkinan besar Anda akan mendapatkan EXC_BAD_ACCESS.

person notnoop    schedule 11.08.2009

Penugasan ke nihil ada sehingga tidak ada yang melihat kode dan khawatir bahwa variabel berada dalam keadaan tidak terdefinisi.

NSString *string;
NSLog(@"%p", string);

Kode itu akan mencetak nilai sampah karena nilai string tidak ditentukan.

Daripada menulis kode seperti pada contoh Anda, saya lebih suka menggunakan operator ternary. Berikut ini contohnya:

NSString *string = (foo == 1) ? @"Foo is one." : @"Foo is not one.";

Sekarang nilai string selalu ditentukan. Jika ekspresi menjadi rumit dan garis menjadi panjang, cukup gunakan variabel perantara.

Solusi terbaik untuk banyak masalah adalah dengan menghilangkan masalah tersebut. Ini melakukan hal itu.

person Jon Hess    schedule 11.08.2009

Menetapkan variabel ke suatu nilai atau ke nil dapat membuat kesalahan nilai yang tidak diinisialisasi lebih mudah dikenali saat run-time.

NSString *string = @"Foo is not one";
if(foo == 1)
    string = @"Foo is one.";

Berbagai kompiler lebih baik dalam mengenali nilai yang tidak diinisialisasi saat ini.

Salah satu alasan Objective C untuk menyetel pointer ke nil (setelah penggunaan terakhir) adalah pengumpulan sampah.

person Stephen Hoffman    schedule 11.08.2009

Umumnya Anda mungkin akan menetapkan variabel ke nil untuk memastikan Anda memulai dengan status nilai variabel yang diketahui. Jadi Anda tahu bahwa variabelnya adalah nihil pada awalnya dan kemudian Anda dapat membandingkan variabel tersebut dengan nihil. Contoh bagusnya adalah Pemeriksaan kesalahan dengan NSError seperti itu

NSError *error = nil;
[SomeCocoaClass performOperationWithObject:obj error:&error];
if(nil != error){
//handle error
}

Dimungkinkan untuk membuat variabel dan memulai dengan keadaan yang tidak diinisialisasi dan kemudian ketika Anda mencoba membaca variabel itu nanti Anda mendapatkan sampah dan crash. Ini hanyalah praktik pengkodean yang baik untuk menginisialisasi variabel Anda ke keadaan awal yang diketahui, lalu memeriksa keadaan tersebut nanti.

person Colin Wheeler    schedule 11.08.2009