Sampai saat ini (September 2014) saya akan merekomendasikan menggunakan NSInteger/CGFloat
ketika berinteraksi dengan iOS API dll jika Anda juga membangun aplikasi Anda untuk arm64. Ini karena Anda kemungkinan akan mendapatkan hasil yang tidak terduga ketika Anda menggunakan float
, long
danint
mengetik.
CONTOH: FLOAT / GANDA vs CGFLOAT
Sebagai contoh, kami menggunakan metode delegasi UITableView tableView:heightForRowAtIndexPath:
.
Dalam aplikasi 32-bit saja itu akan berfungsi dengan baik jika ditulis seperti ini:
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
float
adalah nilai 32-bit dan 44 yang Anda kembalikan adalah nilai 32-bit. Namun, jika kita mengkompilasi / menjalankan bagian kode yang sama dalam arsitektur arm64 64-bit, 44 akan menjadi nilai 64-bit. Mengembalikan nilai 64-bit ketika nilai 32-bit diharapkan akan memberikan tinggi baris yang tidak terduga.
Anda dapat mengatasi masalah ini dengan menggunakan CGFloat
tipe
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
Tipe ini mewakili 32-bit float
dalam lingkungan 32-bit dan 64-bit double
dalam lingkungan 64-bit. Karenanya saat menggunakan tipe ini metode akan selalu menerima tipe yang diharapkan terlepas dari lingkungan kompilasi / runtime.
Hal yang sama berlaku untuk metode yang mengharapkan bilangan bulat. Metode seperti itu akan mengharapkan nilai 32-bit int
dalam lingkungan 32-bit dan 64-bit long
dalam lingkungan 64-bit. Anda dapat menyelesaikan kasus ini dengan menggunakan tipe NSInteger
yang berfungsi sebagai int
atau long
berdasarkan pada kompilasi / runtime environmentemnt.