2012-04-01 21 views
6

Tôi có Xcode 4.3.1, iOS 5.1 và đã bật ARC để xây dựng ứng dụng của mình.ứng dụng chạy tốt với bản dựng gỡ lỗi, nhưng sự cố khi xây dựng bản phát hành, điều gì có thể là lý do có thể xảy ra?

Bây giờ ứng dụng chạy tốt trong quá trình gỡ lỗi, nhưng sự cố khi xây dựng bản phát hành. Điều gì có thể là lý do có thể cho sự khác biệt? Tôi hoàn toàn dựa vào ARC để quản lý tài nguyên. Tôi nhìn vào bản ghi sự cố, nó chỉ ra rằng bộ nhớ đã được tham chiếu đã được phát hành rồi. Điều gì sẽ là những cạm bẫy phổ biến có thể gây ra vấn đề về xây dựng bán lẻ, khi sử dụng ARC?

Sau đây là những gì tôi nhận được từ nhật ký sự cố

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x6f636552 
Crashed Thread: 0 

EDIT

mục tiêu triển khai của ứng dụng là iOS 5.0. Tôi sử dụng kết nối internet, sự cố hiện tại xảy ra vào thời điểm khi "hiển thị" dữ liệu được trả lại từ dịch vụ web để hiển thị trên UITableViewController. Toàn bộ ứng dụng đang sử dụng ARC, ngoại trừ một vài tệp nguồn từ bên thứ ba mà tôi đã tắt ARC.

+0

Xin cho biết thêm gợi ý, mục tiêu triển khai? Bạn có đang sử dụng kết nối với Internet không? Tất cả các lớp của bạn sử dụng ARC hoặc chỉ một số trong số họ? – Andrea

+0

được thực hiện, vui lòng xem các cập nhật ở trên – tom

+0

Tôi nghĩ rằng tốt hơn là nên thử nghiệm ứng dụng của bạn bằng các công cụ zombie trên sim. Thực tế là bạn đang trộn các lớp ARC và không phải ARC có thể dẫn đến một số vấn đề khi sử dụng các mẫu ủy quyền hoặc thông báo. Rất khó để hiểu tại sao chỉ xảy ra trên thiết bị chứ không phải trên sim, nhưng có lẽ là do sự khác biệt phần cứng giữa hai thiết bị. – Andrea

Trả lời

0

tôi không thể có câu trả lời nhưng tôi sẽ liệt kê một vài linh cảm để bạn có thể thử:

  • Hãy chắc chắn rằng bạn không đi qua các đối tượng vào các phương pháp mà không có một "xử lý" trên nó về phía bạn . Và ví dụ sẽ chuyển một thể hiện lớp trình xử lý tới một phương thức mong đợi một đại biểu. Phương thức này không giữ lại trường hợp đó và do đó nó được phát hành trước khi nó gọi phương thức này.
  • Kiểm tra các macro tiền biên dịch của bạn rằng chúng an toàn cho cả hai bản dựng DEBUG & RELEASE. Một ví dụ điển hình là có tuyên bố if trên macro bị xóa trong bản dựng bản phát hành và câu lệnh if không bao gồm câu lệnh có dấu ngoặc nhọn.
  • Nếu bạn phụ thuộc vào định nghĩa trình biên dịch để bật/tắt một số phần nhất định của mã (thông qua việc sử dụng các điều kiện #if), hãy đảm bảo những phần cần thiết được đặt trong cấu hình xây dựng của bạn.

Nếu tôi có thể nghĩ nhiều hơn, tôi sẽ cố thêm chúng.

4

Bất cứ khi nào điều này xảy ra với tôi, có vẻ như là do bản phát hành bản phát hành tích cực hơn về việc xóa các tham chiếu yếu. Nếu bạn gán nhầm một thứ gì đó vào một thuộc tính yếu (ví dụ, nếu bạn đang thêm các bản xem trước mà bạn cũng sẽ giữ các tham chiếu yếu) trước khi bạn có bất kỳ tham chiếu mạnh nào đến nó, điều này có thể hoạt động khi gỡ rối và thất bại khi phát hành. Ví dụ: (pseudocode)

@property (weak) UILabel * label; 
... 
self.label = [[UILabel alloc] init]; 
[self.view addSubview:self.label]; 
... 
self.label.text = @"hello"; 

Tôi đã thấy điều này gây ra sự cố truy cập không tốt trên bản phát hành và không được chú ý khi gỡ lỗi.

+0

có, điều này chắc chắn có thể dẫn đến sự cố và là một sai lầm. bạn không bao giờ nên có một ref yếu. –

0

Bạn có mục tiêu khác để phát hành và gỡ lỗi không? Kiểm tra xem tất cả các tệp có được tham chiếu chính xác cho mục tiêu phát hành hay không.

Trong trường hợp của chúng tôi, một danh mục trên UIButton không được nhìn thấy bởi mục tiêu phát hành. Một quảng cáo-Hoc xây dựng đã đi tốt, cho đến khi ai đó gọi một phương pháp được thực hiện bởi thể loại đó. Vì chúng tôi không lưu trữ một bản lưu trữ từ bản dựng Ad-Hoc nên không có cách nào để gỡ lỗi một sự cố.(bài học)

Không chắc chắn liệu danh sách đó có được liệt kê là EXC_BAD_ACCESS trong nhật ký sự cố hay không, nhưng có thể giúp ai đó xác định sự cố cụ thể về bản phát hành của chúng.

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