8

私はObjective-CとXCodeを初めて使用しますが、XCode4.4が私のプロパティを自動的に合成するのを見てうれしく思いました。これは、プロパティに@synthesizeと入力する必要がなくなったこと、self.propertyName = @"hi";たとえば、を使用してプロパティにアクセスできることを意味すると思います。

理解しやすいようにサンプルコードを書き直そうとしていますが、このコードはカスタムゲッターメソッドを実装しています。サンプルコードでは、プロパティはのように手動で合成され@synthesize managedObjectContext = __managedObjectContext;ます。カスタムゲッターは次のようになります。

- (NSManagedObjectContext *)managedObjectContext {
    if (__managedObjectContext != nil) {
        return __managedObjectContext;
    }
    
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        __managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        [__managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    
    return __managedObjectContext;
}

この人のコードでは、彼が手動で合成したアクセサーを使用して、取得と設定の両方を行っていることがわかります。私は自分のコードで、をに置き換えることができました__managedObjectContextself.managedObjectContext、違います。これを行うと、プロパティに割り当てようとしているというエラーが表示されreadonlyます。このプロパティはこの他のコーダーによって読み取り専用として定義されているため、これは理にかなっています。

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;

それで、彼が手動でプロパティを合成する方法について何かを理解します。つまり、彼がその指定されたセッターを使用すると、何らかの方法で読み取り専用プロパティを設定できるようになります。

参照しているコードのように、プロパティを手動で合成すると、すべてが機能するようになりますが、それは新しい自動合成を利用していません。を削除すればreadonly、期待どおりにこのプロパティを設定できますが、なぜ彼が読み取り専用として持っているのかわからないような気がするので、そこで何かを壊しているに違いありません。

それで、私は新しい自動合成を誤用していますか?読み取り専用のために自動合成で作成されない場合、セッターを使用してこれを設定するにはどうすればよいですか?

4

1 に答える 1

10

XCodeが自動合成するとき、それは以下をシミュレートします...

@synthesize foo = _foo;

したがって、self.fooまたはobject.fooを使用してデータに適切にアクセスできます。

ただし、アクセサメソッド(および初期化子とdealloc)の実装では、iVarを直接使用する必要があります。

これらのiVarには2つのアンダースコアがあることに注意してください。そして、それらはアクセサメソッドで操作されています。_managedObjectContextを使用すると、準備が整います。

于 2012-08-01T04:28:18.980 に答える