readonly 属性对 Objective-C @属性 指令的影响
the effect of readonly attribute to Objective-C @property directive
这是我的情况,我声明一个 objective-c class 如下:
@interface FileItem : NSObject
@property (nonatomic, strong, readonly) NSString *path;
@property (nonatomic, strong, readonly) NSArray* childItems;
- (id)initWithPath:(NSString*)path;
@end
@implementation LCDFileItem
- (id)initWithPath:(NSString*)path {
self = [super init];
if (self) {
_path = path;
}
return self;
}
- (NSArray*)childItems {
if (!_childItems) { // error, _childItems undeclared!
NSError *error;
NSMutableArray *items = [[NSMutableArray alloc] init];
_childItems = items; // error, _childItems undeclared!
}
return _childItems; // error, _childItems undeclared!
}
我将 "path" & "childItems" 标记为只读 属性,编译器抱怨未声明“_childItems”标识符,看来我不能使用“-(NSArray* )childItem" 作为 "childItem" 属性 的 getter 函数(我更改函数名称,一切正常),为什么?
我理解 "readonly" 属性使 xcode 省略了 属性 的 setter 函数,但是对 getter 函数有什么影响?
Xcode 抱怨是因为你的代码的问题是 属性 不会自动合成 if 你实现 all 需要访问器方法,对于您的只读 属性 来说,它只是实现 getter。
在@implementation后面添加:
@synthesize childItems = _childItems;
错误应该会消失...
来自 Apple 文档:"If you implement both a getter and a setter for a readwrite property, or a getter for a readonly property, the compiler will assume that you are taking control over the property implementation and won’t synthesize an instance variable automatically."
一种常见的方法是将 "readonly" 属性 放在 header 中,并将重复的 属性 定义放在 class 扩展 没有 "readonly" 属性。
这是我的情况,我声明一个 objective-c class 如下:
@interface FileItem : NSObject
@property (nonatomic, strong, readonly) NSString *path;
@property (nonatomic, strong, readonly) NSArray* childItems;
- (id)initWithPath:(NSString*)path;
@end
@implementation LCDFileItem
- (id)initWithPath:(NSString*)path {
self = [super init];
if (self) {
_path = path;
}
return self;
}
- (NSArray*)childItems {
if (!_childItems) { // error, _childItems undeclared!
NSError *error;
NSMutableArray *items = [[NSMutableArray alloc] init];
_childItems = items; // error, _childItems undeclared!
}
return _childItems; // error, _childItems undeclared!
}
我将 "path" & "childItems" 标记为只读 属性,编译器抱怨未声明“_childItems”标识符,看来我不能使用“-(NSArray* )childItem" 作为 "childItem" 属性 的 getter 函数(我更改函数名称,一切正常),为什么? 我理解 "readonly" 属性使 xcode 省略了 属性 的 setter 函数,但是对 getter 函数有什么影响?
Xcode 抱怨是因为你的代码的问题是 属性 不会自动合成 if 你实现 all 需要访问器方法,对于您的只读 属性 来说,它只是实现 getter。
在@implementation后面添加:
@synthesize childItems = _childItems;
错误应该会消失...
来自 Apple 文档:"If you implement both a getter and a setter for a readwrite property, or a getter for a readonly property, the compiler will assume that you are taking control over the property implementation and won’t synthesize an instance variable automatically."
一种常见的方法是将 "readonly" 属性 放在 header 中,并将重复的 属性 定义放在 class 扩展 没有 "readonly" 属性。