2009-02-11 28 views
7

Tôi nhận được một EXC_BAD_ACCESS (SIGBUS) trên dòng này trong dự án iPhone của tôi (biến = nil!):là if (biến) giống như nếu trong Objective-C

if (timeoutTimer) [timeoutTimer invalidate]; 

Điều đó có tôi stumped là tôi không hiểu làm thế nào mà dòng có thể sụp đổ, kể từ khi tuyên bố nếu có nghĩa là để được kiểm tra cho nil. Tôi có hiểu lầm cách Objective-C hoạt động không, hoặc làm các số dòng trong các câu lệnh sự cố đôi khi có dòng sai trong đó?

Trả lời

16

Chỉ vì biến được đặt thành giá trị khác ngoài nil không có nghĩa là biến trỏ đến đối tượng hợp lệ. Ví dụ:

id object = [[NSObject alloc] init]; 
[object release]; 
NSLog(@"%@", object); // Not nil, but a deallocated object, 
         // meaning a likely crash 

Bộ hẹn giờ của bạn có thể đã bị loại bỏ (hoặc chưa được tạo?) Nhưng biến không được đặt thành 0.

+0

làm cho cảm giác hoàn hảo, cảm ơn. Tôi nhận ra rằng tôi đã không giữ lại bộ hẹn giờ, đó là điều tôi nên làm. – rustyshelf

+0

Thông thường không cần phải giữ lại bộ hẹn giờ. Nếu bạn tạo bộ đếm thời gian với initWithFireDate ..., nó sẽ không được tự động phát hành. Và một khi bộ đếm thời gian được thêm vào một runloop (hoặc bằng addTimer hoặc một trong các phương thức scheduleTimer ...), runloop giữ lại nó cho đến khi nó kết thúc với nó. – Chuck

+0

Tôi tạo ra nó với NSTimer scheduleTimerWithTimeInterval mà tôi giả định là tự động phát hành. InitWithFireDate có được coi là tốt hơn không? – rustyshelf

-1

Chúng phải giống nhau. Có lẽ số dòng thực tế là không chính xác.

Tìm các lỗi có thể khác gần đó trong mã của bạn và xem bạn có tìm thấy gì không.

6

Tôi vừa gặp phải vấn đề tương tự, vì vậy đây là một ví dụ khác về những gì có thể gây ra một kiểm tra chẳng hạn như séc của bạn không thành công.

Trong trường hợp của tôi, tôi đã nhận được giá trị từ một cuốn từ điển như thế này:

NSString *text = [dict objectForKey:@"text"]; 

Sau đó, tôi đã sử dụng các biến như thế này:

if (text) { 
    // do something with "text" 
} 

Điều này dẫn đến một lỗi EXC_BAD_ACCESS và chương trình sụp đổ.

Vấn đề là từ điển của tôi đã sử dụng giá trị NSNull trong trường hợp đối tượng có giá trị rỗng (nó đã được deserialized từ JSON), vì NSDictionary không thể giữ giá trị nil. Tôi đã kết thúc làm việc xung quanh nó như thế này:

NSString *text = [dict objectForKey:@"text"]; 
if ([[NSNull null] isEqual:text]) { 
    text = nil; 
} 
+1

Chết tiệt, tôi đã không nhận ra NSDictionary không thể giữ giá trị Nil. Câu trả lời chính xác. – Ben

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