4

次のコードがあります。

// 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 を再宣言したが、weakorを再宣言しないと文句を言うのはなぜassignですか?

4

1 に答える 1

3

私はあなたの質問を理解しています...

  • MyObject クラスのメンバ メソッドで myproperty を読み書きしたい。
  • しかし、他のクラスから mypropyty を読み取り専用にしたい。

// MyObject.h

@interface MyObject : NSObject
{
@private
    id _myproperty;
}
@property (nonatomic, copy, readonly) id myproperty;
@end

// MyObject.m

#import "MyObject.h"

@interface MyObject ()
// @property (nonatomic, copy, readwrite) id myproperty; // No needs
@end

@implementation MyObject
@synthesize myproperty = _myproperty;


- (void)aMethod
{
    _myproperty = [NSString new]; // You can read & write in this class.
}

@end

// その他.m

#import "MyObject.h"

void main()
{
   MyObject *o = [MyObject new];
   o.myproperty = [NSString new]; // Error!! Can't write.
   o._myproperty = [NSString new]; // Error!! Can't acsess by objective c rule.
   NSString *tmp = o.myproperty; // Success readonly. (but myproperty value is nil).
}
于 2012-08-03T00:37:18.760 に答える