@protected
for メソッドに似たものを探しています。(セッターとゲッター)で@protected
のみ機能するようです。@properties
通常のメソッドでも同様の動作を得る方法はありますか?
4 に答える
あなたのコメントに基づいて、コンパイラから隠れることについて話していると思います。これは確かに可能ですが、おそらく少し面倒です。一方、ランタイムから隠すことは不可能です。何らかの方法で、誰かが本当にあなたのメソッドにアクセスしたい場合、彼らはアクセスします。
コンパイラから隠すには、次のように別のヘッダー ファイルでクラス拡張を定義する必要があります。
#import "MyClass.h"
@interface MyClass ()
@property (nonatomic, strong) NSObject* protectedObject;
-(void) protectedMethod;
@end
ヘッダー MyClass+Internal.h を呼び出すことができ、ライブラリを構築している場合は、ヘッダーの可視性をプライベートに設定します
あとは、サブクラスの実装ファイル (または内部でメソッドを使用する場所) にプライベート ヘッダーをインポートするだけです。
私はこれが.hファイルの名前付き(匿名ではなく)カテゴリを介して実際に実装されているのを見てきました:
//MyClass.h:
@interface MyClass : NSObject
/*Public stuff...*/
@end
@interface MyClass (protected)
/*Protected stuff...*/
@end
しかし、他の人が言及しているように、この名前付きカテゴリは、実際にはちょっとしたヒントを提供する方法にすぎません。開発者がドキュメントではなく.hファイルを見ることに依存しているカテゴリです。魔法のようなことは何もせず、実際のアクセス制御も実装していません。
また、ObjCの保護されたメソッドのトピックについては、Cocoaが継承よりも構成と委任を優先するように設定されていることを忘れないでください。自分が一生懸命働いていることに気付いた場合は、上流で泳いでいる可能性があります。
Objective-C には、メソッドごとのアクセス制御はありません。
API をいくつかのカテゴリに分割し、それらを別のヘッダー ファイルに配置して、何らかのアドバイザリ アクセス コントロールを実現できます。
メソッド protectedまたはprivateを宣言することはできません。上記のようにメソッドを「プライベート」と宣言することは単なる偽物であり、実際には何も止めません。Objective-C の動的な性質により、メソッドのアクセス制御を実装することはできません。(コンパイラまたはランタイムを大幅に変更することで実行できますが、速度が大幅に低下しますが、明らかな理由により、これは実行されません。)
ソース:
http://objectmix.com/c/177901-methods-access-modifiers-objective-c.html
いくつかの回避策でこの機能をシミュレートできるようですが、それが良いスタイルであるとは思えません。