我想向我的用户公开NSArray
(我希望他们只阅读它),但在我的班级中,我想使用NSMutableArray
。
我尝试了以下代码,但没有发出任何警告:
// In the .h
@interface MyClass : NSObject <NSApplicationDelegate>
@property (nonatomic, readonly) NSArray * test ;
@end
和
// In the .m
@interface MyClass ()
@property (nonatomic, strong, readwrite) NSMutableArray * test ;
@end
@implementation MyClass
- (id)init
{
self = [super init];
if (self)
{
self.test = [[NSMutableArray alloc] init] ;
}
return self;
}
@end
但是,如果我尝试从我的班级中访问@property
test
,我可以使用方法addObject:
。所以,我想先前的事情是不可能的。
为什么没有这样的警告?
答案 0 :(得分:3)
我认为混合属性类型不是一个好习惯。相反,我会创建一个访问器,返回私有可变数组的副本。这更传统。请注意,请勿使用-init:
方法使用self访问自己:
// In the .h
@interface MyClass : NSObject <NSApplicationDelegate>
- (NSArray *)test;
@end
// In the .m
@interface MyClass ()
@property (nonatomic, strong) NSMutableArray *aTest;
@end
@implementation MyClass
- (id)init
{
self = [super init];
if (self)
{
_aTest = [[NSMutableArray alloc] init] ;
}
return self;
}
- (NSArray *)test
{
return [self.aTest copy];
}
@end
答案 1 :(得分:0)
@property
只是语法糖,可以自动为您创建getter / setter方法。使用readonly
文件中的.h
,只会为公众创建getter方法,但通过在.m
文件中覆盖它,您可以在实现中获得这两种方法。
readwrite
是默认的(see here),因此即使遗漏readwrite
put仍然在您的实现文件中有@property
,您将获得一个setter方法。最好在readwrite
文件中显式写入.m
,这样您和其他人就会得到一个提示,即此变量可能只在.h
文件中声明为只读。