2012-02-24 23 views
8

tôi đã xác định điều này trong mã:Tại sao một IBOutletCollection trỏ đến các ô tĩnh từ bảng phân cảnh trả về null?

@property (nonatomic, weak) IBOutletCollection(UITableViewCell) NSSet * certaintyCells; 

và tổng hợp. Tôi hoàn toàn chắc chắn rằng bộ điều khiển này được sử dụng trong bảng câu chuyện và kết nối ba ô với bộ sưu tập này.

Tiếp theo, trong lời gọi phương thức didSelectRowAtIndexPath:, tôi đã thêm mã này, với NSLog thêm để gỡ lỗi:

 NSLog(@"Certainty Cells: %@",certaintyCells); 
     for (UITableViewCell * cell in certaintyCells) { 
      [cell.textLabel setTextColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1]]; 
      [cell setSelectionStyle:UITableViewCellSelectionStyleBlue]; 
     } 

Kết quả là thế này:

Certainty Cells: (null) 

Và dĩ nhiên, hành vi dự kiến ​​không xảy ra.

Bất kỳ ý tưởng nào về lý do tại sao điều này xảy ra? Tôi đã đảm bảo rằng tôi đang sử dụng các tế bào tĩnh, và không phải là nguyên mẫu động. Là một lưu ý phụ, ba ô này cũng được kết nối với IBOutlets (hoạt động) của riêng chúng.

Xin cảm ơn,

Trả lời

33

Tôi tìm thấy câu trả lời bằng cách thực hiện các thay đổi không có ý nghĩa với tôi vào thời điểm đó. Tôi đã thay đổi thuộc tính từ weak thành strong và đã hoạt động.

Tại sao tôi đã có (yếu) ở nơi đầu tiên:

Bởi vì tôi không muốn giữ một cái gì đó không bị deallocated nếu xem quyết định dỡ bỏ do cảnh báo bộ nhớ/etc.

Tại sao suy nghĩ này là sai:

Bởi vì một IBOutletCollection là một thể hiện của NSSet hoặc NSArray. rằng NSSet/NSArray không được giữ lại bởi khung nhìn, bởi vì nó không phải là chính nó là một subview. Với một IBOutlet một tài sản yếu là tốt, với một IBOutletCollection một tài sản mạnh là cần thiết, nếu không số tham chiếu là số không ngay lập tức và nó được deallocated.

Tôi đang rời khỏi đây ở đây với hy vọng rằng nó sẽ giúp người khác.

+0

Nghĩ như vậy, không thể tìm thấy câu trả lời trong tài liệu của apple. Thay đổi nó mạnh mẽ, nó hoạt động ngay bây giờ. Tôi tự hỏi nếu nó sẽ được dealloc-ed .. bất cứ ai? – Oritm

+0

Nó nên dealloc tự động khi xem deallocs điều khiển xem, bạn có thể đặt nó để nil trong viewDidUnload nếu bạn muốn nó dealloc ở đó. –

3

Tôi sẽ nói rằng (null) giá trị là hậu quả của giải phóng đối tượng kể từ ARC đoán rằng đối tượng không được tham chiếu từ bất kỳ ai và đặt giá trị thành nil plus deallocating nó tại một số điểm.

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