readonly,non-mutable,public和readwrite,mutable,private @property:更多信息?

时间:2014-02-12 14:23:02

标签: objective-c properties

我想向我的用户公开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:。所以,我想先前的事情是不可能的。

为什么没有这样的警告?

2 个答案:

答案 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文件中声明为只读。