2010-04-29 23 views
5

UITableView của tôi đang trả lại EXEC_BAD_ACCESS, nhưng tại sao!EXEC_BAD_ACCESS trong UITableXem cellForRowAtIndexPath

Xem đoạn mã này!

Tải UITableView hoạt động tốt, vì vậy allXYZArray != nil và được phổ biến!

Sau đó di chuyển các tableview để phía dưới và sao lưu nguyên nhân nó sụp đổ, vì nó đi để tải lại phương pháp cellForRowAtIndexPath

Nó không thành công trên dòng:

"NSLog(@"allXYZArray::count: %i", [allXYZArray count]);" 

     (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAt 

IndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"CellIdentifier"; 
UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 


cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
@try 
{ 
if (allXYZArray == nil) { 
    NSLog(@"nil"); 
    allXYZArray = [ToolBox getMergedSortedDictionaries:allXYZGiven SecondDictionary:allXYZSought]; 
} 
NSLog(@"%i", [indexPath row]); 
NSLog(@"allXYZArray::count: %i", [allXYZArray count]); 
+0

Bạn có thể đăng mã cho phần còn lại của phương thức cùng với mã cho [ToolBox getMergedSortedDictionaries: SecondDictionary:]? – MrHen

Trả lời

10

EXC_BAD_ACCESS có nghĩa là chương trình của bạn đang cố gắng truy cập vào một địa chỉ bộ nhớ mà không hợp lệ hoặc không thể tiếp cận từ quá trình của bạn. Điều này thường xảy ra nhất khi bạn thử gửi một tin nhắn đến một đối tượng đã được dealloced. Vì vậy, bước đầu tiên trong việc gỡ lỗi EXC_BAD_ACCESS là tìm ra đối tượng nào chương trình của bạn đang cố gắng gửi thông báo đến khi xảy ra sự cố. Thường thì câu trả lời không rõ ràng, trong trường hợp này, NSZombieEnabled là một công cụ tuyệt vời để xác định dòng mã nào gây ra sự cố.

Trong trường hợp của bạn, bạn đã xác định rằng sự cố xảy ra khi bạn gọi [allXYZArray count], làm cho allXYZArray nghi phạm chính của chúng tôi. Đối tượng này đang được trả lại từ +[ToolBox getMergedSortedDictionaries:SecondDictionary:], do đó, có khả năng lỗi của bạn đang trong quá trình triển khai phương thức đó. Tôi đoán rằng nó sẽ trả về một vật thể đã được phát hành thay vì tự động phát hành, theo quy định của Memory Management Programming Guide for Cocoa. (Đây là một trong những tài liệu quan trọng nhất trong SDK, tôi khuyên bạn nên đọc lại nó mỗi tháng một lần cho đến khi các chính sách và kỹ thuật của nó trở thành bản chất thứ hai.)

1

Ok, tái sử dụng một tế bào, làm không đảm bảo rằng ô sẽ được khởi tạo đúng cách:

UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

ô đôi khi sẽ là rỗng (đặc biệt là lần đầu tiên tôi đoán).

Kiểm tra ô để trống và nếu có, hãy khởi chạy đúng cách.

if (cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
Các vấn đề liên quan