将保留对象分配给弱属性

我正在使用Xcode 6 ,我用UITableViewcustom Cell创建了我的应用程序。 这是我的custom cell

 @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 

正如您所看到的,我有一个IBOutets到一个作为UIView的子类的SuggestedSeriesView 。 在TableView DataSource方法中,我创建了这些SuggestedSeriesView并将它们分配为:

 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}]; 

编译器给我警告:

将保留对象分配给弱属性; 对象将在分配后释放

为什么这会发生在SuggestedSeriesViewcell保留,因为它没有IBOutlet

谢谢您的帮助。

这是因为你的属性很弱,这意味着它们不会保留任何东西,它们只能引用东西。

IBOutlet等于void,它只是xcode告诉它“这可以在接口构建器上连接”的提示。

界面构建器的属性属于弱类型和IBOutlet的原因是,它们由故事板的View控制器的视图本身保留,因此如果在界面构建器中创建视图控制器,并添加视图,那么链接此视图在代码中,您的属性不必非常强大,因为它已经由其中一个视图保留。

您应该将这些属性更改为

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

您正在创建一个对象,同时将其分配给弱属性。 在这一点上,没有任何强烈的参考,所以根据ARC的规则,它应该立即被填补。 (注意,比运行调试版本时,这不会立即发生)。

从故事板加载时,会创建对象,添加为子视图, 然后分配给sockets。 superview有很强的参考,所以这很好。

要在不更改sockets属性类型的情况下镜像此行为(尽管说实话,现在没有太大的危害),您应该将新对象分配给局部变量,然后将其添加到视图中,然后将其分配给outlet属性。

 @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;