2010-04-05 28 views
7

Ứng dụng của chúng tôi đã bị lỗi với tần suất khoảng 1 trong 1.500 lần khởi chạy do lỗi đang chứng minh khó nắm bắt. Phần có liên quan của dấu vết ngăn xếp được bao gồm. Nó đang được kích hoạt như một cuộc gọi lại vì vậy tôi không có tham chiếu cho nơi nó xảy ra trong mã của riêng tôi.Lỗi UIAlertView trên phương pháp không có giấy tờ

Có vẻ như những gì đang xảy ra là có một đối tượng UIViewAnimationState đang gọi UIAlertView's phương thức riêng tư (_popoutAnimationDidStop:finished:). Chỉ có vấn đề là, nó xuất hiện UIAlertView đã được dealloced bởi thời điểm này. Tôi không làm bất cứ điều gì kỳ lạ với quan điểm cảnh báo. Tôi ném chúng lên, và tôi chờ người dùng nhập vào. Tất cả chúng đều được hiển thị trước khi được phát hành.

Bất kỳ ai gặp phải điều này? Tại thời điểm này, tôi đang nghiêng về phía nó là một lỗi của Apple.

Thread 0 Crashed: 
0 libobjc.A.dylib     0x3138cec0 objc_msgSend + 24 
1 UIKit       0x326258c4 -[UIAlertView(Private) _popoutAnimationDidStop:finished:] 
2 UIKit       0x324fad70 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] 
3 UIKit       0x324fac08 -[UIViewAnimationState animationDidStop:finished:] 
4 QuartzCore      0x311db05c run_animation_cal 

lbacks

+0

bạn có nhớ lỗi đã nhận được trong trình gỡ lỗi không? là nó có thể: [* respondsToSelector:]: tin nhắn được gửi tới phiên bản được phân phối – Cole

Trả lời

12

Nó có khả năng rằng UIAlertView đang cố gắng gọi một phương thức trên đại biểu của mình sau khi đại biểu đó đã được phát hành. Để ngăn chặn loại lỗi này, bất kỳ lúc nào bạn đặt đối tượng làm đại biểu của một đối tượng khác, hãy đặt thuộc tính ủy nhiệm thành không trong phương thức dealloc của đối tượng đại biểu. ví dụ.


@implementation YourViewController 
@synthesize yourAlertView; 

- (void)dealloc { 
    yourAlertView.delegate = nil; // Ensures subsequent delegate method calls won't crash 
    self.yourAlertView = nil; // Releases if @property (retain) 
    [super dealloc]; 
} 

- (IBAction)someAction { 
    self.yourAlertView = [[[UIAlertView alloc] initWithTitle:@"Pushed" 
         message:@"You pushed a button" 
         delegate:self 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil] autorelease]; 
    [self.yourAlertView show]; 
} 

// ... 

@end 
+1

Cảm ơn hoàn hảo. Rõ ràng là giải pháp, tôi đã bị treo lên trên giả định rằng đó là UIAlertView bằng cách nào đó được phát hành sớm. Đôi khi bạn chỉ cần có một bộ mắt khác trên đó. Đối với bất kỳ ai khác gặp phải điều này, hãy lưu ý rằng nếu bạn đang sử dụng ngăn xếp điều hướng có thể được đẩy/xuất hiện từ không xác định (ví dụ như mất kết nối), bạn cần phải luôn luôn hủy đặt bất kỳ đại biểu nào trong dealloc của bạn. Apple KHÔNG minh họa mẫu này đúng trong các dự án mẫu của họ. – DougW

+3

Tôi đang đối mặt với cùng một vấn đề, Ai đó có thể chỉ ra cách giải quyết vấn đề này khi AlertView được khai báo dưới dạng biến cục bộ. Chúng ta có phải thiết lập các đại biểu để nil trên gọi lại đại biểu? – rustylepord

+0

Thú vị rằng điều đó xảy ra ngay cả trong các ứng dụng được biên dịch ở chế độ ARC. Tại sao Apple đã không làm cho tài sản ủy quyền của UIAlertView an toàn yếu như họ đề nghị cho tất cả các thuộc tính giống như đại biểu? – Lukasz

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