次のコードがあります。
// MyObject.h
#import <Foundation/Foundation.h>
@interface MyObject : NSObject
@property (nonatomic, readonly) id property;
@end
// MyObject.m
#import "MyObject.h"
@interface MyObject ()
@property (nonatomic, copy, readwrite) id property;
@end
@implementation MyObject
@synthesize property = _property;
@end
これにより、次のコンパイラ警告とエラーが生成されます。
warning: property attribute in continuation class does not match the primary class
@property (nonatomic, copy, readwrite) id property;
^
note: property declared here
@property (nonatomic, readonly) id property;
^
error: ARC forbids synthesizing a property of an Objective-C object with unspecified ownership or storage attribute
ただし、クラス継続のプロパティの再宣言を変更してストレージ修飾子を にするとweak
、警告やエラーは生成されません。ただし、(驚くべきことに?) 呼び出しに対して生成されたコードで-[MyObject setProperty:]
はobjc_storeStrong
なく、予想されるobjc_storeWeak
.
LLVM 3.1 の時点で、合成された ivar のデフォルト ストレージはstrong
. 私の質問はこれだと思います: codegen が実装での再宣言よりもヘッダーでの宣言を優先するのはなぜですか? copy
第二に、 as を再宣言したが、weak
orを再宣言しないと文句を言うのはなぜassign
ですか?