2012-02-25 29 views
5

tôi đã phát triển một ứng dụng ios rằng đã có một:Lỗi NSError *; vs lỗi NSError * = nil;

NSError *error; 

thay vì:

NSError *error = nil; 

Nó hoạt động tốt trong khi tôi đã được gỡ lỗi trong trình giả lập và gỡ lỗi trên thiết bị khi kết nối. Thời điểm tôi lưu trữ nó và gửi nó vào TestFlight để triển khai để thử nghiệm, tôi bắt đầu nhận được Lỗi không xác định lỗi xuất hiện trong nhật ký sự cố.

Tại sao điều này lại xảy ra?

Trả lời

7

Điều này xảy ra vì bạn có con trỏ chưa được khởi tạo. Nó không sụp đổ miễn là bạn nhận được may mắn, nhưng sử dụng con trỏ như vậy là undefined behavior.

+0

@ daSn0wie Khi nghi ngờ, hãy ghi lại địa chỉ của biến chưa được khởi tạo ngay sau khi khai báo. 'NSLog (@" error:% p ", error);' – bneely

3

Để làm rõ về dasblinkenlights trả lời, điều này được khai báo một biến:

NSError *error; 

... và điều này được khai báo và gán một biến

NSError *error = nil; 

Khi bạn sử dụng nó theo cách đầu tiên và cố gắng để truy cập nó mà không bao giờ đặt nó vào một cái gì đó, giá trị nó trỏ vào được gọi là "rác" Nó là một con trỏ đến một số bộ nhớ khác, và truy cập nó sẽ gần như luôn luôn làm cho ứng dụng của bạn sụp đổ. Do đó, cách tốt nhất là chỉ định giá trị cho biến của bạn như trên hoặc ngay sau đó.

+1

Không nên truy cập vào biến 'NSError' trừ khi có lỗi, thường bằng phương thức trả về trạng thái lỗi. Các API không đảm bảo giá trị của lỗi var nếu không có lỗi. Người ta không thể dựa rằng chỉ vì var đã được thiết lập để nil và thay đổi bởi các cuộc gọi rằng có một lỗi. Vì vậy, thiết lập nó để nil không có hại cũng không tốt. – zaph

+0

Nó thực sự phụ thuộc vào API mà anh ta đang sử dụng. – coneybeare

+1

Từ tài liệu của Apple trên 'NSError':" Nói chung, một phương pháp sẽ báo hiệu một điều kiện lỗi bằng — ví dụ — trả về NO hoặc nil chứ không phải bởi sự hiện diện đơn giản của một đối tượng lỗi. " Dựa vào mã lỗi trả về sẽ luôn an toàn, dựa vào đối tượng 'NSError' có thể hoặc không an toàn. Đó là một sự lựa chọn. – zaph

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