3

Objective-C ですべてのアクセサー(get のような const メソッド) を読み取り専用プロパティに置き換える場合、不利な点はありますか? それらは交換可能ですか?

ドキュメント/読みやすさのために読み取り専用プロパティを好みます。

C++ から来た私は、すべての const メソッド (可変でないメソッド) をObjC の読み取り専用プロパティに置き換えることを考えています。

この慣習に従えば、通常のメソッドが状態を変更すると自動的に想定できます (C++ の非 const メソッド)。また、関数型プログラミングの観点から、読み取り専用プロパティが状態を変更しない (副作用がない) ことを知っておくと便利です。

4

5 に答える 5

3

はい、もちろんです。必要に応じて、この方法で実装にアプローチしても問題ありません。文脈上、そうすることには潜在的に多くの利点があります。

注意すべき欠点は、生成されたプロパティのコストです。プロパティは 20 倍以上遅くなる可能性があります。(たとえば) プロパティが再割り当て可能でない場合、参照カウントの循環/自動解放アクティビティをすべて実行するのは非常に無駄です。

もう 1 つの (マイナーな) 欠点は、頻繁にプライベート セッターを実装または宣言していることに気付くことです。

于 2012-10-25T15:28:35.930 に答える
2

それらには同じ方法でアクセスできます(ドット構文またはメソッド構文)。一番気持ちいいことは何でもしてください。私はメソッドとしてメソッドを使用することを好みますが、それらが(いくつかの)ロジックを実行する場合。アクセサ/ゲッターがデータを返すだけの場合は、プロパティの方が適しています。

于 2012-10-25T15:04:16.647 に答える
1

それでも、それらを設定するための何らかの方法が必要であり、適切なセッターを持つことは、メモリ管理の目的を自動化するために非常に便利なことがよくあります。クラス拡張は、まさにこの目的を達成するために作成されました。パブリックは読み取り専用、プライベートは読み取り/書き込み。

Foo.h:

@interface Foo : NSObject
@property(readonly, copy) NSString* bar;
@end

Foo.m:@interface Foo()@property(readwrite、copy)NSString*バー; @終わり

@implementation Foo
... no need to @synthesize ...
- randomMethod

{[self setBar:@ "bas"]; ... self.bar; _bar = [NSString stringWithFormat:@ "%@%@"、[self bar]、self.bar]]; }

はい、copy@interface宣言にが必要です。インターフェイスの修飾子は、読み取り専用プロパティであっても、setterだけでなくgetterのcodegenも変更できます。

この質問に対する私の答えも関連性があると思われるでしょう。

于 2012-10-25T15:31:20.707 に答える
1

これはKey-Value Codingに関連しています。次のようにします。

@interface Boat : NSObject {
   NSString *name;
}
@property (nonatomic, retain) NSString *name;
@end

と...

@interface Boat
@synthesize name;
@end

シンセサイザーが (この場合) 行うことは、2 つのメソッドを作成することです。

-(NSString *)name;
-(void)setName;

いわゆる「キャメルケース」を使用してセレクターに名前を付け、ivar の最初の文字を大文字に変更してから、セッターの前に「set」を追加します。getter の名前は ivar の名前です。

ivar 名と既存のメソッドがこのパターンに従っている場合、手書きのアクセサーをプロパティに置き換えることは、ドット構文または明示的なメッセージを使用するかどうかに関係なく、問題なく機能します。

boat.name = @"Pequod"にコンパイルされ[boat setName:@"Pequod"]ます。にコンパイルboat.nameされ[boat name]ます。

アクセサーがそのように命名されていない場合は、このパターンに一致するようにアクセサーを使用するコード内の場所を修正する必要があります。このパターンに従ったコーディングは、すべての Objective-C / Cocoa プログラミングに対する最善のアプローチです。

于 2012-10-25T15:09:46.217 に答える
1

はい、交換可能です。

@interface MyClass : NSObject
@property (nonatomic, readonly) NSString *myStr;
@end

と同じです

@interface MyClass : NSObject
-(NSString *)myStr;
@end
@interface MyClass() { NSString *_myStr } 
@end
@implementation MyClass
-(NSString *)myStr { return _myStr; }
@end

コードには表示されませんが、プロパティはアクセス可能な myStr メソッドを作成します。どちらの場合も、 self.myStrまたはを使用[self myStr]してメソッドを呼び出すことができます。

補足: iOS 6 を使用している場合は、@synthesize ステートメントを含める必要はありません。@synthesize myStr = _myStr;それ以外の場合は、実装ファイルに次のように記述します。

于 2012-10-25T15:20:28.480 に答える