2

次のガイドを使用して共有する静的ライブラリを作成しています: http://www.amateurinmotion.com/articles/2009/02/08/creating-a-static-library-for-iphone.html

関数の 1 つで、UIView のサブクラスであり、パブリック ヘッダーで定義されている「SomeUIView」を返しますが、パブリック ヘッダーで SomeUIView の内部インスタンス変数を公開したくありません。

SomeUIView のプライベート内部ヘッダー ファイルにカテゴリを使用しようとしましたが、「クラス 'SomeUIView' のインターフェイス宣言が重複しています」という問題が発生し続けます。

誰もこれを行う方法を知っていますか?

ありがとう!

4

2 に答える 2

3

カテゴリと拡張機能は、インスタンス変数をクラスに追加できません。ここでは PIMPL イディオムを使用します - プライベート実装オブジェクトを使用します。

// header
@class MyObjImpl;
@interface MyObj {
    MyObjImpl* impl;
}
@end

// implementation file:
@interface MyObjImpl {
    id someIvar;
}
// ...
@end

// ... etc.

これにより、内部使用のために何かを追加したい場合に備えて、パブリック インターフェイスを安定させることもできます。

重複したインターフェイス」は、2 番目のインターフェイス宣言でかっこが欠落していることが原因です。

// header:
@interface MyObj 
// ...
@end

// implementation file:
@interface MyObj () // note the parentheses which make it a class extension
// ...
@end
于 2010-05-26T00:29:01.637 に答える
0

「連想参照」と呼ばれる Objective-C 2 の機能を使用することもできます。

これは実際にはオブジェクト指向 API ではありませんが、ランタイムのいくつかの単純な関数を使用して、オブジェクトを別のオブジェクトに追加/削除できます。

void objc_setAssociatedObject(id object, void * key, id value)

値が nil の場合、値を設定または削除します。

id objc_getAssociatedObject(id object, void * key)

指定されたキーの値を取得します。

これは、カテゴリを実装するときに既存のオブジェクトに「インスタンス変数」を追加する手段でもあることに注意してください。

キーは、次を使用してモジュール プライベートとして宣言できるプライベート変数への単純なポインターです。

static char SEARCH_INDEX_KEY = 0;
于 2010-12-16T16:38:24.553 に答える