[Objective-C] Auto property synthesis will not synthesize property 'xxxx'; it will be implemented by its superclass, use @dynamic to acknowledge intention

Xcodeでbuildした時にワーニングを取ると思うのですが、こんなワーニングについて調べて見ました。

ワーニング

Auto property synthesis will not synthesize property 'xxxxx'; it will be implemented by its superclass, use @dynamic to acknowledge intention

内容

スーパークラスで定義しているインスタンス変数をサブクラスで定義していると出るワーニングのようです。

スーパークラス

1
2
3
4
5
@interface MyBase : NSObject
 
@property (nonatomic, strong) NSString *myName;
 
@end

サブクラス

1
2
3
4
5
@interface MySubBase : MyBase
 
@property (nonatomic, strong) NSString *myName;
 
@end

上記の例の場合は、myNameが重複して定義されています。
ワーニングを消すには、サブクラスのソースファイル(.m)で@dynamicを記述する必要があります。

1
2
3
4
5
@implementation MySubBase
 
@dynamic myName;
 
@end

@dynamicを記述することで、コンパイラにアクセサメソッドを自動生成する必要が無いと伝えることでできるそうです。
ちなみに、その記述をしてもしなくてもアクセサメソッドはスーパークラスの物がCallされていました。

そもそもサブクラスでスーパークラスのインスタンス変数を再定義するのがおかしいので、そのワーニングが出ること自体がおかしいのですがそんな動作になるようです。

確認した環境

  • macOS 10.13.6(17G65)
  • Xcode Version 10.0 (10A255)

iOS12がリリースされていました。
とりあえずアップデートして確認して見たいと思います。

0 件のコメント :

コメントを投稿