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/CGFloatkhi 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, longvà intcá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;
}
floatlà 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 CGFloatloại
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
Loại này đại diện cho 32 bit floattrong môi trường 32 bit và 64 bit doubletrong 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 intgiá trị 32 bit trong môi trường 32 bit và 64 bit longtrong 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 NSIntegerphục vụ dưới dạng inthoặc longdựa trên môi trường biên dịch / thời gian chạy.