【问题标题】:issue with custom delegate and datasource自定义委托和数据源的问题
【发布时间】:2012-12-07 17:11:30
【问题描述】:

我有一个自定义委托和数据源。但是当我尝试初始化它时,我遇到了几个问题。在我的 .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)

谁能帮我解决这个问题?

亲切的问候!

【问题讨论】:

    标签: iphone objective-c ios delegates datasource


    【解决方案1】:

    代表通常是weak 引用。

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

    其次,问题是,您已经拥有名为dataSource 的属性。


    编辑

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

    【讨论】:

    • 重复符号 _KalDataSourceChangedNotification 在:/Users/geelenstef/Library/Developer/Xcode/DerivedData/Offitel-cpxhgfgbmhddbwbpmyjydsswuygz/Build/Intermediates/Offitel.build/Debug-iphonesimulator/Offitel.build/Objects-normal/ i386/AgendaViewController.o /Users/geelenstef/Library/Developer/Xcode/DerivedData/Offitel-cpxhgfgbmhddbwbpmyjydsswuygz/Build/Intermediates/Offitel.build/Debug-iphonesimulator/Offitel.build/Objects-normal/i386/KalViewController.o ld: 1架构 i386 clang 的重复符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
    • @StefGeelen 如果您注释掉该属性,您还会收到错误消息吗?可以是任何重复的符号。如果不是,AgendaViewControllerKalViewController 有什么关系?
    • 我将 KalViewController 的代码复制到了我的 AgendaViewController 中。因为我需要在 AgendaViewController 类中添加代码并且不想接触 KalViewController 类
    • @NSAddict @dynamic 并不是为了欺骗编译器获取 setter 和 getter,而是表示 setter 和 getter 是在其他地方定义的(与核心数据一样)。
    • @CodaFi 据我所知,这里是说,在任何情况下,是否应该创建实例变量。正在创建 setter 和 getter。如果超类有一个属性并合成它,它会创建一个变量,比如_dataSource@dynamic 只是告诉编译器它不应该创建实例变量,因为它已经存在。
    【解决方案2】:

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

    【讨论】:

    • @codiFi 我通过删除 KalViewController.h 和 .m 修复了它,但你能解释一下你的答案,以便我理解问题。
    • @StefGeelen 我已经尽我所能解释了。具体是什么让您感到困扰?
    • 好吧,我认为你的意思是支持 iVar 是分配为 'id' 的变量,如果你有两次相同的变量声明为 id 类型,Xcode 会开始抱怨吗?这是正确的吗?
    • @StefGeelen 不完全是。真正的情况是,如果我有一个强大的属性,但有一个 Assign 支持 iVar,编译器会发出关于它们不兼容的恶臭。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2011-04-17
    • 2011-09-21
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多