1

我有一个自定义委托和数据源。但是当我尝试初始化它时,我遇到了几个问题。在我的 .h 文件中,如果有的话。

@property (nonatomic, assign) id<UITableViewDelegate> delegate;
@property (nonatomic, assign) id<KalDataSource> dataSource;

这导致在 .m 文件中的合成中出现以下错误。

Existing ivar 'dataSource' for property 'dataSource' with assign attribute must be __unsafe_unretained.

经过一些谷歌搜索魔术后,我发现我应该像这样评估我的变量。

@property (nonatomic, strong) id<UITableViewDelegate> delegate;
@property (nonatomic, strong) id<KalDataSource> dataSource;

但后来我得到了这个错误。

linker command failed with exit code 1 (use -v to see invocation)

有人可以帮我吗?

亲切的问候!

4

2 回答 2

1

您遇到的错误与您的内存限定符无关(它们第一次是正确的)。问题在于您在没有限定词的地方声明了支持 iVar。当 iVar 被声明时,它们是隐含的强,所以如果你去你的影子 iVar,并在前面加上__weakor __unsafe_unretained,警告应该消失。当然,更好的解决方案是完全删除您的支持 iVar,因为 Xcode 会为您合成它们。

于 2012-12-20T08:39:21.530 回答
0

代表通常是weak参考。

使用委托的对象不拥有它。它只是对可能或不能响应的对象的引用。Weak 说,如果对象的真正所有者释放它,它应该被释放。然后弱引用会自动设置为nil并且你不会得到任何僵尸。

其次,问题是,您已经拥有名为dataSource.


编辑

我之前关于重复属性的陈述被证明是错误的。您应该覆盖 setter 和 getter,包括文件中的声明.h和实现.m

于 2012-12-20T08:18:58.193 回答