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 に移動して先頭に or を追加すると__weak__unsafe_unretained警告が消えるはずです。もちろん、バッキング iVar を完全に削除するのがより良い解決策です。Xcode がそれらを合成するからです。

于 2012-12-20T08:39:21.530 に答える
0

委任者は通常、weak参照です。

デリゲートを使用するオブジェクトはそれを所有していません。これは、応答できる、または応答できなかったオブジェクトへの単なる参照です。ウィーク氏によると、オブジェクトの実際の所有者がオブジェクトを解放した場合は、割り当てを解除する必要があります。弱参照は自動的にに設定されnil、ゾンビは発生しません。

第二に、問題は、あなたがすでにと呼ばれるプロパティを持っているということですdataSource


編集

重複したプロパティに関する私の以前のステートメントは間違っていることが判明しました。.hの宣言とファイルの実装の両方で、setterとgetterをオーバーライドする必要があり.mます。

于 2012-12-20T08:18:58.193 に答える