0

クラス ( SomeClass) を拡張してプロパティ ( propOne) を追加しています。また、このクラスにカテゴリ ( CategoryName) を追加して、拡張機能に追加されたプロパティを変更するメソッドを作成したいと考えています。

というコンパイラ エラー メッセージが表示されます[SomeClass setPropOne:] unrecognized selector...

私はobjective-cにかなり慣れていません-カテゴリで作成されたメソッドは、拡張機能を介して追加されたプロパティをどのように変更できますか?

私がやろうとしていることは、コードで最もよく説明できると思います:

@interface SomeClass ()

@property (nonatomic,weak) id propOne

@end

...
...


@implementation SomeClass (CategoryName)

- (void)someMethodWithParam:(id)param
{
 self.propOne = param;
}

@end
4

3 に答える 3

0

関連付けられたオブジェクトを使用して、やりたいことを実行するための実装。
https://github.com/kissrobber/DProperty

于 2014-03-04T04:00:49.100 に答える
0

自動合成メカニズムは、実装のコンパイル時にクラス拡張が可視である場合にのみ、クラス拡張で宣言されたプロパティを合成できます。したがって、例に示されているクラス拡張がSomeClass.hまたはSomeClass.mのいずれかにある場合、プロパティは合成されます。

それ以外の場合、クラス拡張は (この場合は少なくとも) 存在しないプロパティの宣言を提供しています。これが、アクセスしようとすると実行時例外が発生する理由です。これを修正するには、カテゴリでアクセサ メソッドを自分で実装できSomeClass (CategoryName)ます。

その場合に直面する可能性のある問題は、特定のクラスがインスタンス変数を別のクラスに追加する方法がないことです。そのための可能な回避策については、Alfie Hansen の回答を参照してください。

于 2013-10-11T21:35:30.993 に答える
0

@propertyすぐにカテゴリに を追加することはできません。ただし、次のようなものを作成することを含む回避策があります。

static const char kMyChar;

そして、次のような方法でカテゴリにバインドします (「関連付けられたオブジェクト」にします)。

objc_setAssociatedObject(self, &kMyChar, alertWrapper, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

ブロックベースのカテゴリに「プロパティを追加」する良い例の完全なドキュメントについては、こちらをご覧ください...UIAlertView

于 2013-10-11T18:39:14.003 に答える