Nilai default BOOL

Jawaban:

175

Tidak ada nilai default jika Anda menulis

-(void)somemethod {
  BOOL x;  // <--- no default value

Ini diinisialisasi ke sampah.

Namun, untuk BOOL ivar , itu akan diinisialisasi NO, karena keseluruhan instance diisi dengan 0 pada inisialisasi.

(Catatan: Saat ARC diaktifkan, penunjuk objek lokal akan selalu memiliki nilai default nil, tetapi variabel lokal jenis non-objek seperti BOOL masih diinisialisasi ke sampah. Lihat Variabel lokal disetel ke nil? (Objective-C) .)

kennytm
sumber
1
Dapatkah Anda mengandalkan BOOL non ivar untuk selalu menjadi sampah yang sama? atau apakah itu berbeda? (yaitu. Saya melihatnya mengevaluasi ke nilai integer '2' dalam pernyataan NSlog)
bentford
8
@ Bentford: Tidak, Anda tidak bisa.
kennytm
1
sepertinya sepele tapi sangat sangat penting untuk diketahui! Terima kasih!!
triliunan
1
@KennyTM "tipe non-objek seperti BOOL dengan ARC aktif akan tetap diinisialisasi ke sampah". Apa kamu yakin akan hal itu? Tautan yang Anda berikan mengatakan "Variabel instans objek Objective-C selalu disetel ke 0 (atau nil) saat Anda mengalokasikan objek" dan saya tidak dapat menemukan referensi lain yang lebih jelas, jadi semuanya agak kontradiktif bagi saya.
Kristof Van Landschoot
1
dalam kasus saya, variabel lokal BOOL diatur ke 0, itu TIDAK. tetapi ketika dibangun dalam mode Rilis, itu akan menjadi YA.
ngn999
24

Saya melakukan beberapa percobaan sendiri menggunakan Xcode 5.1, OS X Mavericks 10.9.4. Bagi yang belum tahu ALog adalah NSLog yang dimodifikasi. Bagaimanapun, percobaan pertama adalah digunakan isLandscapesebagai variabel publik, dengan @synthesize, untuk diakses oleh pengontrol tampilan induk (ditampilkan di bawah). Eksperimen kedua tidak digunakan @synthesizedan saya, jelas, dulu self.isLandscapemendapatkan hasil yang sama di konsol. Output konsol di bawah kode saya. Eksperimen ketiga menggunakan 'isLandscape' sebagai variabel lokal di dalam metode.

@interface MyClass : UIView // (subclass used in my UIViewController)

@property (nonatomic) BOOL isLandscape;  // < - - - testing this BOOL


@implementation MyClass

@synthesize isLandscape;

- (void)awakeFromNib
{
    [super awakeFromNib];
    // Test for YES or NO
    if (isLandscape == YES) {
        ALog(@"isLandscape == YES");
    } else if (isLandscape == NO) {
        ALog(@"isLandscape == NO");
    } else {
        ALog(@"isLandscape != YES/NO");
    }
    // Test for nil or non-nil
    if (isLandscape) {
        ALog(@"isLandscape");
    } else if (!isLandscape) {
        ALog(@"!isLandscape");
    } else {
        ALog(@"!= nil/non-nil");
    }
    // Test its value
    ALog(@"isLandscape == %d", isLandscape);
}

Hasil ini berasal dari dua percobaan pertama…

2014-08-28 08:18:52.909 MyApp[493:60b] -[MyClass awakeFromNib] [Line 157] isLandscape == NO
2014-08-28 08:18:52.911 MyApp[493:60b] -[MyClass awakeFromNib] [Line 166] !isLandscape
2014-08-28 08:18:52.912 MyApp[493:60b] -[MyClass awakeFromNib] [Line 172] isLandscape == 0

Dalam EKSPERIMEN KETIGA 'isLandscape' tidak lagi menjadi properti. Saya mengaturnya menjadi variabel lokal dengan hasil yang menarik:

- (void)awakeFromNib
{
    [super awakeFromNib];
    BOOL isLandscape; // < - - - testing this BOOL
    // Test for YES or NO
    if (isLandscape == YES) {
        ALog(@"isLandscape == YES");
    } else if (isLandscape == NO) {
        ALog(@"isLandscape == NO");
    } else {
        ALog(@"isLandscape != YES/NO");
    }
    // Test for nil or non-nil
    if (isLandscape) {
        ALog(@"isLandscape");
    } else if (!isLandscape) {
        ALog(@"!isLandscape");
    } else {
        ALog(@"!= nil/non-nil");
    }
    // Test its value
    ALog(@"isLandscape == %d", isLandscape);
}

Hasil ini berasal dari percobaan ketiga…

2014-08-28 08:28:33.483 MyApp[581:60b] -[MyClass awakeFromNib] [Line 159] isLandscape != YES/NO
2014-08-28 08:28:33.486 MyApp[581:60b] -[MyClass awakeFromNib] [Line 164] isLandscape
2014-08-28 08:28:33.487 MyApp[581:60b] -[MyClass awakeFromNib] [Line 172] isLandscape == -24

Saya menduga properti diinisialisasi oleh saya atau Xcode secara otomatis, tetapi variabel lokal tidak mendapatkan nilai sama sekali. Meski begitu, lihat variabel lokal [Baris 164] bukan YA atau TIDAK tapi bukan nihil? Saya kira itu adalah nilai sampah (acak) yang tidak dapat Anda andalkan. Saya harap ini membantu orang berikutnya. Saya belajar sesuatu tetapi saya menantikan komentar. Terima kasih dan semoga berhasil!

Murat Zazi
sumber