0

プロトコルのプロパティをオーバーライドして変更可能にしようとすると、いくつかの問題が発生します。

私はこのプロトコルを持っています:

@protocol TheProtocol
     @property (nonatomic, readonly) NSString *someString;
@end

そして、このクラス:

@interface SuperObject : NSObject <TheProtocol>
@end

次のように変数を合成します。

@implementation SuperObject
@synthesize someString;

-(id)init {
 if(self=[super init]) {
    someString = [aString copy];
 }
 return self;
 }

@end

したがって、内部的に書き込むことができます

次に、サブクラスがあります。

@interface SubObject : SuperObject 
@end

@implementation SubObject
@synthesize someString;

- (id)init {
  if(self=[super init]) {
    NSLog(@"Some string is %@",someString");
    someString = [bString copy];
  }
  return self;
}

私のサブクラスでは、someString に代入しようとしてもうまくいきません。サブクラスでsomeStringも合成しようとしましたが、それを変更しようとする前に、「someString」を出力すると、「something」ではなくnilが出力されます

回答済み

答えがわかった。最終的にうまくいったのはこれです:

@interface SuperObject : NSObject <TheProtocol> {
     @protected
     NSString *someString;
}
@end
4

1 に答える 1

1

何が起こっているかというと、サブクラスで合成すると、スーパークラスのものとは異なる ivar が割り当てられます。したがって、印刷時の値はnilです。次のようにして、元のivarを参照できますself.someString.

それが役立つことを願っています。

于 2013-09-30T19:30:00.570 に答える