13

私は次のコードを持っています:

-(id) initWithCoordinate:(CLLocationCoordinate2D)c title:(NSString *)t
{
    self = [super init];

    if (self)
    {
        coordinate = c;
        self.title = t;
    }

    return self;
}

どこにcoordinateある:

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

2 つの質問がありました。

  • 読み取り専用のプロパティに割り当てても問題ありませんか?
  • その前にすべきではありませんcoordinateself?(例: self.coordinate = c)。

ps。このコードを使用してもエラーは発生しません。これは本の例です。

4

8 に答える 8

3
  • 読み取り専用のプロパティに割り当てても問題ありませんか?

    はい、それを含むインスタンスの外でプロパティを変更したくない場合は問題ありません。

    例: 配列の count プロパティ。ここで count は、配列によって保持されるオブジェクトの数に依存するプロパティです。したがって、Array オブジェクトの外部から変更しないでください。

  • その前に自分自身を調整するべきではありませんか?(例: self.coordinate = c)。

    読み取り専用の場合、setter メソッドを介してプロパティを変更することはできません。

    self.coordinate は [self setCoordinate:] に変換されますが、これは読み取り専用であるため、setter メソッドがプロパティを変更できないため許可されていません。

したがって、 を直接設定する必要がivarあります。これは、readonly プロパティが定義されているオブジェクト内からのみ行うことができます。

すなわち

_coordinate = value; //or coordinate = value if you have synthesized it. 

興味のある方は、

self.propertyName && self.property = indirectly calls getter and setter method.

また、実装では、setter と getter は、プロパティが public である場合に _ivars をパブリックにアクセスできるようにします。

- (void)setProperty(value) //self.property = value
 {
    _property = value;
 }

- (id)property  //self.property
  {
     return _property;
  }
于 2013-07-18T11:23:48.703 に答える
0
  1. いいえ、それは問題ありません。適切な割り当て方法readonlyは次のとおりです。

    - (CLLocationCoordinate2D)coordinate {
    
        //create the struct and return it.
    
        return value;
    
    }
    
  2. いいえ、逆です。title次のように設定する必要があります。

    _title = t;
    
于 2013-07-18T11:15:56.670 に答える
0

トリッキーな人々がこれを行うのを見てきました....

Source.h

@property (readonly) BOOL  isRunning;

Source.m

- (void) blahBlahBlah { ...
   self->_isRunning = YES; ...

これらのタイプのアクセサーについて見つけることができるドキュメントはほとんどありません...私はそれが単なる標準的なC構造であると確信しています...私はあまりよく知らないものです...しかし、これは次の場合に進む方法ですあなたの主題の熟達..私のものよりも優れています...

于 2013-10-05T02:55:24.680 に答える