Kể từ hiện tại (tháng 9 năm 2014) tôi sẽ khuyên bạn nên sử dụng NSInteger/CGFloat
khi tương tác với API của iOS, v.v. nếu bạn cũng đang xây dựng ứng dụng của mình cho arm64. Điều này là do bạn có thể sẽ nhận được kết quả bất ngờ khi bạn sử dụng float
, long
và int
các loại.
VÍ DỤ: FLOAT / NHÂN ĐÔI vs CGFLOAT
Để làm ví dụ, chúng tôi sử dụng phương thức ủy nhiệm UITableView tableView:heightForRowAtIndexPath:
.
Trong ứng dụng chỉ 32 bit, nó sẽ hoạt động tốt nếu được viết như thế này:
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
float
là giá trị 32 bit và 44 bạn đang trả về là giá trị 32 bit. Tuy nhiên, nếu chúng ta biên dịch / chạy cùng đoạn mã này trong kiến trúc arm64 64 bit thì 44 sẽ là giá trị 64 bit. Trả về giá trị 64 bit khi dự kiến giá trị 32 bit sẽ cho chiều cao hàng không mong muốn.
Bạn có thể giải quyết vấn đề này bằng cách sử dụng CGFloat
loại
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
Loại này đại diện cho 32 bit float
trong môi trường 32 bit và 64 bit double
trong môi trường 64 bit. Do đó, khi sử dụng loại này, phương thức sẽ luôn nhận được loại dự kiến bất kể môi trường biên dịch / thời gian chạy.
Điều này cũng đúng với các phương thức mong đợi số nguyên. Các phương thức như vậy sẽ mong đợi int
giá trị 32 bit trong môi trường 32 bit và 64 bit long
trong môi trường 64 bit. Bạn có thể giải quyết trường hợp này bằng cách sử dụng loại NSInteger
phục vụ dưới dạng int
hoặc long
dựa trên môi trường biên dịch / thời gian chạy.