我正在使用 Xcode 6 ,我创建的应用中包含UITableView
和custom 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
个SuggestedSeriesView
到UIView
的子类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}}?
感谢您的帮助。
答案 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;