2012-01-11 24 views
11

Tôi đang làm một hướng dẫn giỏ hàng: Tôi có một mảng thu thập đầu vào từ một trường văn bản và sau đó hiển thị nó trong NSTableView. Bạn có thể kiểm tra một mục và xóa nó khỏi danh sách. Tôi muốn hiển thị cảnh báo chỉ khi có nội dung nào đó được chọn. Vì vậy, tôi có điều này:Cảnh báo "Chuyển đổi ngầm định mất độ chính xác nguyên ..."

-(IBAction)removeItemFromShoppingList:(id)sender { 
     int selectedItemIndex = [shoppingListTableView selectedRow]; 
     if (selectedItemIndex == -1) return; 
     NSAlert *alert = [[NSAlert alloc] init]; 
     ... 
     [alert runModal]; 
     [alert release]; 
} 

On line 2 đây (int selectedItemIndex...) tôi nhận được một cảnh báo màu vàng: chuyển đổi ngầm mất nguyên chính xác:’NSInteger’ (aka ‘dài’) để ‘int’.

Tại sao?

+2

Có thể vì int ngắn hơn một thời gian dài? –

+0

Ngoài ra, bạn chỉ nên xem cảnh báo này khi xây dựng trình mô phỏng vì NSInteger là 32 bit khi xây dựng cho thiết bị. Như những người khác đã nói, bạn nên sử dụng các loại chính xác tương tự hoặc một cách rõ ràng đúc để nói "Tôi biết cho một thực tế này sẽ không bao giờ lớn hơn 32 byte". –

+0

Ý của bạn là "chỉ xây dựng cho trình giả lập"? (Nó dành cho ứng dụng Mac chứ không phải iOS) – janeh

Trả lời

14

Từ tài liệu táo:

Khi xây dựng các ứng dụng 32-bit, NSInteger là một 32-bit số nguyên. Ứng dụng 64 bit xử lý NSInteger dưới dạng số nguyên 64 bit.

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
#else 
typedef int NSInteger; 
#endif 

UPDATE:

Giải thích chi tiết:

[shoppingListTableView selectedRow] trả về một NSInteger, và bạn đang xây dựng một ứng dụng 64-bit, vì vậy nó là trong thực tế, một long.

Bạn có thể sử dụng long selectedItemIndex thay vì int selectedItemIndex để chặn cảnh báo này, nhưng cảnh báo lại xuất hiện khi tạo phiên bản 32 bit.

Cách tốt hơn là sử dụng NSInteger selectedItemIndex, xử lý trường hợp này một cách chính xác.

+1

Tôi đã nhận lỗi "Typedef định nghĩa lại với các loại khác nhau dài vs int" – justicepenny

+0

Tôi đã nhận lỗi tương tự quá –

+2

@KunalBalani và justicepenny bạn aren ' t phải cố gắng thêm mã này vào dự án của bạn. Điều này chỉ cho thấy cách NSInteger được định nghĩa trong nội bộ. –

8

Vì biến của bạn thuộc loại int và bạn đang cố gắng sao chép giá trị của một biến loại NSInteger vào nó. An NSInteger có thể chứa các giá trị lớn hơn int có thể, vì vậy bạn sẽ nhận được cảnh báo rằng có thể xảy ra tràn. Có lẽ cách khắc phục đơn giản nhất là thay đổi int thành NSInteger. (Khi bạn muốn sao chép giá trị của một biến để chạy thử nghiệm trên nó, bạn thường nên sử dụng một biến cùng loại.)

+0

Ok, tôi ngạc nhiên khi nhận được điều này, kể từ khi tôi sao chép các hướng dẫn từ cuốn sách! Nó được viết cho XC3, vì vậy có lẽ đó là vấn đề? (Hoặc một lỗi đánh máy trong cuốn sách?) – janeh

+8

Nếu những người viết sách là những người lập trình tuyệt vời, họ sẽ vận chuyển sản phẩm thay vì sách! :) – Fletch

+0

@Fletch, tôi nhận thấy rằng mã mẫu không hiển thị cảnh báo là dành cho SDK 10.6, dự án của tôi là 10.7 - nó hiển thị cảnh báo! – janeh

1

Sử dụng

NSInteger selectedItemIndex = [shoppingListTableView selectedRow]; 

Thay vì

int selectedItemIndex = [shoppingListTableView selectedRow]; 
0

tôi nhận ra cảnh báo chỉ làm:

int selectedItemIndex = (int)[shoppingListTableView selectedRow];    
6

Sử dụng

int selectedItemIndex = (int)[shoppingListTableView selectedRow]; 

Thay vì

int selectedItemIndex = [shoppingListTableView selectedRow]; 
1

Bạn có thể cập nhật cài đặt dự án, để loại bỏ tất cả

Implicit conversion loses integer precision cảnh báo, bằng cách thiết lập

Implicit Conversion to 32 Bit Type để No

trong cài đặt xây dựng của dự án.

enter image description here

Các vấn đề liên quan