1

クラス拡張を使用してプライベートメソッドを定義します。

@interface DFPObfuscator ()

+ (NSData *)PS_transform:(CCOperation)encryptOrDecrypt data:(NSData *)data;

@end

PS_Appleは、次のようなプレフィックスを使用することを推奨しています。

...プライベートメソッドの名前がスーパークラスの名前とは異なることを絶対に確認したい場合は、プライベートメソッドに独自のプレフィックスを追加できます。プレフィックスは可能な限り一意である必要があります。おそらく、会社またはプロジェクトに基づいたもので、形式はXX_です。したがって、プロジェクトの名前がByte Floggerの場合、プレフィックスは。になりますBF_addObject:

しかし、私有財産はどうですか?接頭辞を付ける必要がありますPS_か、それとも問題ではありませんか?

例は次のとおりです。

@interface MTTController ()

@property (strong, nonatomic) Class modelClass;
@property (strong, nonatomic) Class viewClass;

@end

スーパークラスに私有地があったら問題になるのでしょうmodelClass

4

2 に答える 2

1

通常、サブクラス化にはこのアドバイスは必要ありません。Appleがアンダースコアのプレフィックスが付いていないプライベートメソッドを作成する場合、それはフレームワークのバグです。

OK、私はここで少し子供です....それは彼らのフレームワークのバグであり、あなたはそれに対してレーダーを開くべきです、しかし彼らはいつもそれをします。とはいえ、プライベートメソッドのプレフィックスを付けるためのこの推奨事項は、実際にはこの方法では機能しません。

まず、メソッドが「プライベート」であるかどうかは関係ありません。ObjCにはプライベートメソッドのようなものはありません。ヘッダーで宣言されていないメソッドがあります。Appleのプライベートメソッドの1つと衝突するパブリックメソッドを宣言すると、メソッドがプライベートである場合と同じ問題が発生します。Appleは、先頭にアンダースコアがないサブクラス化可能なクラスにプライベートメソッドを含めるべきではありません。彼らがそうするケースを避けようとすると、時期尚早の狂気を引き起こします。ほとんどの場合、心配する価値はありません。

しかし!(常にありますが)おそらく心配する必要がある場合があります。それはカテゴリです。Appleがでカテゴリメソッドpopを定義し、NSMutableArrayもで定義popしたNSMutableArray場合、実行されるバージョンは未定義です。(私に起こったので、この特定の例を示します。)したがって、カテゴリメソッドに名前が付けられている可能性がある場合は、Appleが同じことを行うのを防ぐために、おそらくプレフィックスを付ける必要があります。前に言ったように、Appleは先頭にアンダースコアを付けずにプライベートカテゴリメソッドを作成するべきではありませんが、そうするので、カテゴリはこれについて心配する必要があるかもしれません。カテゴリは、「ポップ」などの「一般的な」名前を追加する可能性が最も高い場所でもあります。したがって、問題になる可能性が高くなります。

ここでたくさんの話があります。短いバージョンは次のとおりです。

  • 一般的に言えば、メソッドにプレフィックスを付ける必要はありません。
  • おそらく、非常にわかりやすい名前を持つカテゴリメソッドのプレフィックスを付ける必要があります。

クラス拡張はカテゴリではないことに注意してください。これらはの拡張である@interfaceため、通常は接頭辞を付けないでください。プロパティを合成していて、Appleが同じプライベートプロパティを持っている場合は、コンパイルエラーが発生するはずです。したがって、少なくともサブクラス化されるように設計されたクラスでは、ほとんどの場合、プロパティは問題になりません。

「こうすれば問題ない」といいのですが、それが本当の答えです。

于 2012-05-07T19:49:19.413 に答える
0

全く問題なし ;)

しかし、あなたができることはこれです:

@synthesize myVariableの場合、MTTController.mで; 代わりにこれを行うだけです:

@synthesize myVariable = _myVariable;

_は、多くの場合、クラスのプロパティを表します。
または、.hで_myVariableという名前を直接付けることもできます

于 2012-05-07T19:31:57.933 に答える