2014-10-27 20 views
9

Tôi đang sử dụng Xcode 6 và tôi đã tạo ứng dụng của mình với UITableViewcustom Cell trong đó. Đây là tôi custom cellGán đối tượng được giữ lại cho thuộc tính yếu

@interface SuggestingTableViewCell : UITableViewCell 

@property (nonatomic, weak) IBOutlet SuggestedSeriesView *seriesOne; 
@property (nonatomic, weak) IBOutlet SuggestedSeriesView *seriesTwo; 
@property (nonatomic, weak) IBOutlet SuggestedSeriesView *seriesThree; 
@property (nonatomic, weak) IBOutlet SuggestedSeriesView *seriesFour; 

@end 

Như bạn có thể thấy tôi có bốn IBOutets đến một SuggestedSeriesView đó là một lớp con của UIView. Trong TableView DataSource phương pháp tôi đã tạo ra những SuggestedSeriesView và gán chúng thích:

cellIdentifier = suggestionCell; 
SuggestingTableViewCell *suggesting = (SuggestingTableViewCell *)[tableView dequeueReusableCellWithIdentifier:suggestionCell]; 
Series *ser1 = series[0]; 
suggesting.seriesOne = [[SuggestedSeriesView alloc] initWithFrame:suggesting.seriesOne.bounds 
                andSeriesData:@{JV_SERIES_IMAGE_URL : ser1.imageURL, 
                    JV_SERIES_TITLE : ser1.title}]; 
Series *ser2 = series[1]; 
suggesting.seriesTwo = [[SuggestedSeriesView alloc] initWithFrame:suggesting.seriesTwo.bounds 
                andSeriesData:@{JV_SERIES_IMAGE_URL : ser2.imageURL, 
                    JV_SERIES_TITLE : ser2.title}]; 
Series *ser3 = series[2]; 
suggesting.seriesThree = [[SuggestedSeriesView alloc] initWithFrame:suggesting.seriesThree.bounds 
                 andSeriesData:@{JV_SERIES_IMAGE_URL : ser3.imageURL, 
                     JV_SERIES_TITLE : ser3.title}]; 
Series *ser4 = series[3]; 

suggesting.seriesFour = [[SuggestedSeriesView alloc] initWithFrame:suggesting.seriesFour.bounds 
                andSeriesData:@{JV_SERIES_IMAGE_URL : ser4.imageURL, 
                    JV_SERIES_TITLE : ser4.title}]; 

Trình biên dịch mang lại cho tôi những cảnh báo rằng:

Gán đối tượng giữ lại để sở hữu yếu; đối tượng sẽ được phát hành sau khi phân

Tại sao điều này đang xảy ra với SuggestedSeriesView bị giữ lại bởi các cell vì nó không có IBOutlet?

Cảm ơn sự giúp đỡ.

+1

Không, nó không phải là và đó là chính xác điểm. Việc giữ lại không xảy ra vì nội dung là 'IBOutlet' nhưng vì nội dung là' strong'. –

Trả lời

18

Điều này xảy ra vì các thuộc tính của bạn yếu, điều này có nghĩa là chúng sẽ không giữ lại bất kỳ thứ gì, chúng chỉ có thể tham chiếu.

IBOutlet tương đương với khoảng trống, nó chỉ là gợi ý cho xcode để cho biết "điều này có thể được kết nối trên trình tạo giao diện".

Lý do tại sao các thuộc tính từ trình tạo giao diện có kiểu yếu và IBOutlet là vì chúng được giữ lại bằng chế độ xem của trình điều khiển Chế độ xem, vì vậy nếu bạn tạo bộ điều khiển chế độ xem trong trình tạo giao diện và thêm chế độ xem và THEN liên kết chế độ xem này trong mã mà thuộc tính của bạn không phải mạnh mẽ vì nó đã được giữ lại bởi một trong các khung nhìn.

Bạn nên thay đổi các thuộc tính để

@property (nonatomic, strong) SuggestedSeriesView *seriesOne; 
@property (nonatomic, strong) SuggestedSeriesView *seriesTwo; 
@property (nonatomic, strong) SuggestedSeriesView *seriesThree; 
@property (nonatomic, strong) SuggestedSeriesView *seriesFour; 
+4

_ "chúng được giữ lại bởi bộ điều khiển Xem của bảng phân cảnh" _ điều này không đúng. Các cửa hàng có thể yếu vì chúng là các bản xem xét của một cái gì đó và một giám sát duy trì một tham chiếu mạnh mẽ đến các bản xem trước của nó. – jrturton

+0

có bạn là đúng – Pochi

9

Bạn đang tạo một đối tượng cùng một lúc như gán nó vào thuộc tính yếu. Tại thời điểm này, không có gì có một tham chiếu mạnh mẽ đến nó, do đó, theo các quy tắc của ARC nó phải được ngay lập tức nilled ra. (Lưu ý hơn khi chạy gỡ lỗi xây dựng, điều này không xảy ra ngay lập tức).

Khi tải từ bảng phân cảnh đối tượng được tạo, được thêm dưới dạng chế độ xem con và thì được gán cho ổ cắm. Các superview có một tài liệu tham khảo mạnh mẽ để điều này là tốt.

Để phản ánh hành vi này mà không thay đổi loại ổ cắm của bạn (mặc dù thành thật mà nói, hiện tại không có nhiều tác hại), bạn nên gán đối tượng mới cho biến cục bộ, sau đó thêm nó vào chế độ xem, sau đó gán cho tài sản đầu ra.

+0

OK Cảm ơn bạn, tôi nghĩ rằng tôi sẽ thay đổi thuộc tính tài sản ngay bây giờ :) – YuviGr

1
@interface SuggestingTableViewCell : UITableViewCell 

@property (nonatomic, weak) IBOutlet SuggestedSeriesView *seriesOne; 

@end 

cellIdentifier = suggestionCell; 

SuggestingTableViewCell *suggesting = (SuggestingTableViewCell *)[tableView dequeueReusableCellWithIdentifier:suggestionCell]; 

Series *ser1 = series[0]; 

SuggestedSeriesView * strongSeriesOne = [[SuggestedSeriesView alloc] initWithFrame:suggesting.seriesOne.bounds andSeriesData:@{JV_SERIES_IMAGE_URL : ser1.imageURL, JV_SERIES_TITLE : ser1.title}]; 

suggesting.seriesOne = strongSeriesOne; 
Các vấn đề liên quan