2011-11-02 37 views
5

Tôi viết ứng dụng iOS và sử dụng thư viện imageStore để tải hình ảnh chậm và lưu chúng vào bộ nhớ. (Https://github.com/psychs/imagestore)iOS kiểm tra xem đại biểu có tồn tại trước khi gọi phương thức

On ViewController tôi tạo imagestore dụ:

imageStore = [ImageStore new]; 
imageStore.delegate = self; 

Khi hình ảnh được tải successfuly, gọi imagestore phương pháp đại biểu

- (void)imageStoreDidGetNewImage:(ImageStore*)sender url:(NSString*)url 

rằng làm reloadData trên tableview để vẽ lại các ô. Tất cả hoạt động tốt. Nhưng có vấn đề: nếu ViewController didUnload (quay trở lại trong bộ điều khiển điều hướng) và tải hình ảnh, ứng dụng kết thúc với sự cố, bởi vì phương pháp gọi imagestore của ViewController không tải.

tôi cố gắng làm như sau: 1) trong ViewController Tôi đặt mã này trong phần viewDidUnload:

imageStore.delegate = nil; 
imageStore = nil; 

2) Trong imageStore tôi thêm vào kiểm tra cho nil:

if(delegate != nil) { 
    ...call delegate method 
} 

Nó hoạt động, nhưng thỉnh thoảng lại gặp sự cố ứng dụng.

+0

'2)' là không cần thiết. Tin nhắn có thể được gửi an toàn đến đối tượng 'nil'. – Nekto

+0

Cảm ơn bạn đã trả lời! nhưng không có nó bị hỏng 100% nếu tải hình ảnh và tải xuống bộ điều khiển xem ... –

Trả lời

12

Hãy thử đặt mã này trên phần dealloc.

imageStore.delegate = nil; 
imageStore = nil; 

Trong cùng một cách với mệnh đề if là không cần thiết bởi vì bất kỳ cuộc gọi đến một đối tượng bằng không bị lờ đi bởi ứng dụng, vì vậy nếu bạn có một cái gì đó như thế này:

id delegate = nil;  
[delegate callAnyMethod]; 

không có tác dụng trong của bạn hành vi ứng dụng, trong Mặt khác nếu cuộc gọi của phương pháp đại biểu là tùy chọn bạn nên asure đại biểu rằng phản ứng với Selector, một cái gì đó như thế này nên làm như lừa:

if([delegate conformsToProtocol:@protocol(yourProtocolName)] && [delegate respondsToSelector:@selector(imageStoreDidGetNewImage:url:)]) { 
     [delegate imageStoreDidGetNewImage:imageStore url:url]; 
} 

Cheers!

0

Tính năng này hoạt động nhưng thỉnh thoảng xảy ra lỗi ứng dụng.

Đó là một mâu thuẫn. Có hai khả năng:

  1. Sửa lỗi của bạn đã hoạt động và ứng dụng bị lỗi vì một số lý do khác.

  2. Khắc phục của bạn không hoạt động, ứng dụng tiếp tục gặp sự cố vì lý do tương tự đã xảy ra lỗi trước đó.

Thật khó để biết điều gì sai khi không biết khả năng nào trong số hai khả năng này thực tế đang xảy ra. Xem thông báo lỗi và bằng chứng từ sự cố, chẳng hạn như thu thập dữ liệu ngăn xếp. Tại sao ứng dụng gặp sự cố? Liệu nó có cố gắng dereference tài sản delegate một nơi nào đó mà không kiểm tra nó đầu tiên? Liệu nó phụ thuộc vào các đại biểu làm một cái gì đó, để nếu các đại biểu không còn tồn tại điều đó không được thực hiện và do đó dẫn đến một vụ tai nạn? Đây là những thứ tôi muốn tìm, nhưng một lần nữa điều quan trọng nhất là bắt đầu với bằng chứng bạn có và làm theo mũi của bạn.

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