2015-04-10 15 views
9

Sau khi cập nhật lên XCode 6.3, trình biên dịch bắt đầu đưa ra cảnh báo này.XCode 6.3 Cảnh báo: So sánh địa chỉ của 'myObject' không bằng con trỏ null luôn đúng

Comparison of address of 'myObject' not equal to null pointer is always true.

Đây là mảnh của tôi về mã,

enter image description here

Gãi đầu tôi với nó, nhưng không tìm thấy bất kỳ giải pháp hay cách giải quyết để thoát khỏi cảnh báo này.

Câu hỏi của tôi được liên kết với câu hỏi qua số here. Nhưng, nó không thể được giải quyết bằng cách sử dụng câu trả lời thảo luận.

Bất kỳ trợ giúp sẽ được chào đón :)

+0

này có thể bị dập tắt? – Michael

+0

Tôi đã tự hỏi nếu vấn đề này so sánh cụ thể có thể bị đàn áp, vì nó đã xảy ra trong một submodule bên thứ 3, chúng tôi không muốn sửa đổi. Thay vào đó, chúng tôi đã khắc phục vấn đề (theo câu trả lời từ Inder Kumar Rathore) và chia rẽ nó. – Michael

+1

Tôi đang sử dụng cùng một thư viện mà bạn đang gặp phải và gặp phải vấn đề tương tự. Đó là một lớp học tốt đẹp, nhưng thật đáng buồn không xuất hiện tác giả là duy trì nó. Tôi quyết định nĩa nó và tự sửa một số cảnh báo này. Bạn có thể tìm thấy ngã ba của tôi ở đây: https://github.com/dannys42/WYPopoverController –

Trả lời

9

cách chính xác kiểm tra con trỏ là

if (anotherInView != nil) { 
} 

Bạn đang so sánh địa chỉ của một biến với NULL. Mỗi biến có một địa chỉ bạn không thể có một biến có địa chỉ là NULL, bạn có thể có một biến có giá trị là NULL

Cũng anotherRect != NULL là lại không hợp lệ. anotherRect sẽ luôn có giá trị vì đó là struct

+0

Điều đó thực sự không đúng sự thật. Những bit được viết theo cách đó để phát hiện xem biểu tượng có tồn tại trên các nền tảng cũ hơn hay không. Bạn nhận được cảnh báo này vì mục tiêu tối thiểu của bạn đủ mới để nó luôn tồn tại.Tuy nhiên, nếu bạn đã từng nhắm mục tiêu một hệ điều hành cũ hơn và bạn cố gắng kiểm tra giá trị của con trỏ, bạn sẽ nhận được một segfault, bởi vì * address * của con trỏ không tồn tại, ít hơn nhiều giá trị của con trỏ đó. (Có, liên kết yếu là đáng sợ.) – dgatwood

+1

Sửa chữa: Trong trường hợp này, đó là một sai lầm. Nó không phải là * luôn luôn * một sai lầm, bởi vì xây dựng có thể được sử dụng vì lý do tôi đã đề cập. Tôi không nhìn kỹ mã nguồn trước khi bình luận. :-) – dgatwood

1

Có bốn lỗi ở đây. Hai cái đầu tiên là bạn không đặt bất kỳ giá trị ban đầu nào cho các biến CGRect và UIView, do đó không có cách nào để phát hiện lỗi. Hãy thử thiết lập CGRect về độ rộng bằng 0, chiều cao bằng không nếu bạn nghĩ nó hữu ích và đặt UIView thành không.

Sai lầm thứ ba và thứ tư là địa chỉ của biến cục bộ không bao giờ là NULL. (Lưu ý rằng điều này không đúng cho các biến toàn cục trong các thư viện, như tôi đã đề cập trong một chú thích khác - địa chỉ của hằng số con trỏ NSString có thể là NULL nếu ký hiệu không tồn tại trên phiên bản hệ điều hành bạn đang chạy - nhưng biến cục bộ, bạn sẽ được bảo đảm một địa chỉ lên đến điểm mà tràn ngăn xếp của bạn và treo ứng dụng của bạn.)

tôi cũng đang bối rối bởi lý do tại sao bạn đang gọi một phương pháp đại biểu chính mình. Thông thường, hệ điều hành tự gọi các phương thức đó, vì vậy hãy tự gọi chúng là cách sử dụng không điển hình. Để công bằng, tôi đã làm điều đó nhân dịp khi một phương pháp đại biểu thực hiện một tính toán mà tôi cần ở một nơi khác trong mã, và tôi cũng đã thực hiện nó khi thực hiện các đại biểu gọi các đại biểu khác, nhưng trong ngữ cảnh của câu hỏi này, nó có vẻ như là một sai lầm tiềm ẩn.

0

Đối với câu lệnh đầu tiên, một thay đổi để:

if (!CGRectIsNull(anotherRect)) { 

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