Saya melihat "tipe baru" BOOL
( YES
, NO
).
Saya membaca bahwa jenis ini hampir seperti arang.
Untuk pengujian saya lakukan:
NSLog(@"Size of BOOL %d", sizeof(BOOL));
NSLog(@"Size of bool %d", sizeof(bool));
Baik untuk melihat bahwa kedua log menampilkan "1" (kadang-kadang di C ++ bool adalah int dan ukurannya 4)
Jadi saya hanya ingin tahu apakah ada beberapa masalah dengan tipe bool atau sesuatu?
Bisakah saya menggunakan bool (yang tampaknya berfungsi) tanpa kehilangan kecepatan?
c
objective-c
types
boolean
Francescu
sumber
sumber
bool
. Semua kerangka kerja Objective-C digunakanBOOL
.NSInteger progressTime = 2;//any value NSInteger totalTime = 1;//any value BOOL success = (progressTime>=totalTime)
// itu selalu memberiNO
But Once aku menerima(progressTime>=totalTime)
nilai itu menjadibool
tipesuccess
itu mengembalikan hasil yang benar. Saya tidak mengerti perilaku ini. Saya menggunakanXcode 7.x
daniOS
versi itu8.x
. @BarryWarkSeperti disebutkan di atas, BOOL adalah char yang ditandatangani. bool - type dari standar C99 (int).
BOOL - YA / TIDAK. bool - benar / salah.
Lihat contoh:
Dan hasilnya
Perhatikan bahwa bool! = BOOL. Hasil di bawah ini hanya SEKALI LAGI - NYATA b2
Jika Anda ingin mengonversi bool menjadi BOOL Anda harus menggunakan kode berikutnya
Jadi, dalam kasus kami:
Jadi .. apa yang kita dapatkan sekarang? :-)
sumber
!!b1
. Untuk mengkonversi di antara merekaPada saat penulisan ini adalah versi terbaru dari objc.h:
Ini berarti bahwa pada perangkat iOS 64-bit dan pada WatchOS
BOOL
adalah hal yang persis sama sepertibool
pada semua perangkat lain (OS X, iOS 32-bit) itusigned char
dan bahkan tidak dapat ditimpa oleh flag compiler-funsigned-char
Ini juga berarti bahwa kode contoh ini akan berjalan secara berbeda pada platform yang berbeda (mengujinya sendiri):
BTW tidak pernah menetapkan hal-hal seperti
array.count
keBOOL
variabel karena sekitar 0,4% dari nilai yang mungkin akan negatif.sumber
Tipe Objective-C yang harus Anda gunakan adalah
BOOL
. Tidak ada yang seperti datatype boolean asli, oleh karena itu untuk memastikan bahwa kode dikompilasi pada semua kompiler digunakanBOOL
. (Ini didefinisikan dalam Kerangka Apple.sumber
BOOL
didefinisikan oleh bahasa Objective-C (ada di salah satuobjc/*.h
header), bukan oleh kerangka kerja. Juga, ketika mengkompilasi dengan C99 (yang saya pikir adalah default), maka ada tipe Boolean asli,_Bool
(ataubool
jikastdbool.h
disertakan).Yup, BOOL adalah typedef untuk char yang ditandatangani menurut objc.h.
Saya tidak tahu tentang bool. Itu hal C ++, kan? Jika itu didefinisikan sebagai char yang ditandatangani di mana 1 adalah YA / benar dan 0 adalah TIDAK / salah, maka saya membayangkan itu tidak masalah yang mana yang Anda gunakan.
Karena BOOL adalah bagian dari Objective-C, meskipun, mungkin lebih masuk akal untuk menggunakan BOOL untuk kejelasan (pengembang Objective-C lainnya mungkin bingung jika mereka melihat bool sedang digunakan).
sumber
Perbedaan lain antara bool dan BOOL adalah bahwa mereka tidak mengonversi dengan tepat ke objek yang sama, ketika Anda mengamati kunci-nilai, atau ketika Anda menggunakan metode seperti - [NSObject valueForKey:].
Seperti yang dikatakan semua orang di sini, BOOL adalah char. Dengan demikian, ini dikonversi ke NSNumber yang memegang char. Objek ini tidak bisa dibedakan dari NSNumber yang dibuat dari char biasa seperti 'A' atau '\ 0'. Anda telah benar-benar kehilangan informasi yang awalnya Anda miliki BOOL.
Namun, bool dikonversi menjadi CFBoolean, yang berperilaku sama dengan NSNumber, tetapi yang mempertahankan asal boolean objek.
Saya tidak berpikir bahwa ini adalah argumen dalam debat BOOL vs bool, tetapi ini mungkin menggigit Anda suatu hari.
Secara umum, Anda harus menggunakan BOOL, karena ini adalah jenis yang digunakan di mana saja di API Cocoa / iOS (dirancang sebelum C99 dan jenis bool aslinya).
sumber
Jawaban yang diterima telah diedit dan penjelasannya menjadi sedikit salah. Contoh kode telah di-refresh, tetapi teks di bawah ini tetap sama. Anda tidak dapat berasumsi bahwa BOOL adalah char untuk saat ini karena itu tergantung pada arsitektur dan platform. Jadi, jika Anda menjalankan kode Anda pada platform 32bit (misalnya iPhone 5) dan mencetak @encode (BOOL) Anda akan melihat "c". Ini sesuai dengan tipe char . Tetapi jika Anda menjalankan kode Anda di iPhone 5s (64 bit) Anda akan melihat "B". Ini sesuai dengan tipe bool .
sumber
Saya menentang konvensi di sini. Saya tidak suka typedef untuk tipe dasar. Saya pikir ini adalah tipuan yang tidak berguna yang menghilangkan nilai.
sumber
size_t
), dan keduanyabool
(C99) danBOOL
(ObjC) termasuk dalam kategori itu. Dan jika kode Anda gagal karena perubahan typedef, itu kode Anda yang harus disalahkan karena Anda tampaknya tidak menangani typedef sebagai hal yang buram tetapi mengandalkan implementasinya pada satu platform. (Tidak perlu malu, itu terjadi, tapi itu bukan kesalahan yang harus disalahkan.)BOOL varname
alih-alihchar varname
lebih jelas bahwa dua nilai yang valid untuk variabel tersebut adalahtrue
/YES
ataufalse
/NO
.Seperti yang disebutkan di atas
BOOL
bisa menjadiunsigned char
tipe tergantung pada arsitektur Anda, sementarabool
tipeint
. Eksperimen sederhana akan menunjukkan perbedaan mengapa BOOL dan bool dapat berperilaku berbeda:Yang mengejutkan Anda
if(objcBOOL != YES)
akan mengevaluasi ke 1 oleh kompiler, karenaYES
sebenarnya adalah kode karakter 1, dan di mata kompiler, kode karakter 64 tentu saja tidak sama dengan kode karakter 1 sehingga pernyataan if akan dievaluasiYES/true/1
dan baris berikut akan Lari. Namun karena tidak adabool
tipe nol yang selalu mengevaluasi ke nilai integer 1, masalah di atas tidak akan memengaruhi kode Anda. Di bawah ini adalah beberapa tips yang baik jika Anda ingin menggunakanObjective-C BOOL
tipe vsANSI C bool
tipe:YES
atauNO
nilai dan tidak ada yang lain.BOOL
jenis dengan menggunakan!!
operator ganda bukan untuk menghindari hasil yang tidak terduga.YES
penggunaanif(!myBool) instead of if(myBool != YES)
, jauh lebih bersih untuk menggunakan!
operator yang tidak dan memberikan hasil yang diharapkan.sumber
Perlu diketahui juga perbedaan casting, terutama ketika bekerja dengan bitmask, karena casting ke char yang ditandatangani:
Jika BOOL adalah char yang ditandatangani dan bukan bool, cast 0x0100 ke BOOL cukup menjatuhkan bit yang diset, dan nilai yang dihasilkan adalah 0.
sumber