0

私の考えでは、状態は「可動部分」に似ています。可動部分が多いほど、問題が発生する可能性が高くなります。私は国家に対して敵対的な見方をしています。好みの順序で、状態を次のようにしたい:

  1. 存在しない
  2. プライベート読み取り専用
  3. プライベート & パブリック読み取り専用
  4. プライベート読み取り/書き込み & パブリック読み取り専用
  5. パブリック読み取り/書き込み

状態は ivar に格納されます (明示的に宣言されているか、@synthsize を介して暗黙的に宣言されているかに関係なく)。状態へのパブリック アクセスを許可するために、アクセサ メソッドを提供します。上記の意図をコードで表現するには:

  1. コードを書かない
  2. ivar を使用し、コード コメントに依存して防止します (最適ではありません!)。
  3. 2 に public getter を加えたものと同じ
  4. ivar と public getter
  5. 4プラスパブリックセッター

ケース 2 をより適切に解決するにはどうすればよいですか?

4

2 に答える 2

0

まず、

ivar/プロパティ

ivar とプロパティは互換性がありません。それらは同じものではありません。プロパティはインスタンス変数によって「バックアップ」できますが、関係はそこで終わります。

まず、明示的なインスタンス変数を持たないでください。ポイント 2 (または可能な限り近い) を達成するには、読み取り専用プロパティを定義し、次のように @synthesize します。

@synthesize myProperty = myProperty_;

インスタンス変数 (myProperty_) を必要な値に初期化-initし、.m ファイルで再度割り当てないでください。たとえば、使用するとエラーが発生する-init可能性があるため、その .m ファイルで割り当てを避けることができないと自分自身を信じていない場合 (末尾のアンダースコアはそれを支援するためにあります) 。#define

#define myProperty_ someDefinitelyNonExistingIdentifier
于 2012-06-26T10:29:16.733 に答える
-1
//this is the guts of the solution. It is basically uses pointers to cast away the const.
#define EMK_INIT_READONLY_IVAR(ivar, value) (*(typeof(value) *)(&ivar) = value)


@interface Foo : NSObject
@end



@implementation
{
    id const _bar;
    const NSInteger _baz;
}



-(id)init
{
    self = [super init];
    if (self != nil)
    {
        //we could use KVC to set object values, but it's preferable to have a mechanism 
        //which is identical for object and scalar values.
        EMK_INIT_READONLY_IVAR(_bar, @"I got a brand new combine harvester, oh-ah, oh-ah!");
        EMK_INIT_READONLY_IVAR(_baz, 0xDEADBEEF);
    }
    return self;
}

@end
于 2012-06-26T09:35:09.743 に答える