将保留对象分配给弱属性

时间:2014-10-27 07:05:27

标签: ios objective-c retain

我正在使用 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

正如您所看到的,我有IBOutetsSuggestedSeriesViewUIView的子类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}]; 并将它们分配为:

SuggestedSeriesView

编译器给我警告:

  

将保留对象分配给弱属性;对象将在作业后发布

cell为什么会发生IBOutlet这种情况,因为它没有{{1}}?

感谢您的帮助。

3 个答案:

答案 0 :(得分:19)

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

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;

答案 1 :(得分:10)

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

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

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

答案 2 :(得分: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;