以只读方式公开财产

时间:2011-12-11 03:32:17

标签: objective-c ios ios5 automatic-ref-counting

我正在编写框架,并希望将某些内部属性公开为readonly。 所以我在标题中添加了一个readonly属性 像这样手动合成它。

-(NSMutableURLRequest*) readonlyRequest {

    return [self.request copy];
}

调用者获取的副本仍然可以变异,但不会影响内部属性。 这是正确的方法吗?还是有其他更好的选择吗?

代码是为ARC编译的,所以没有自动释放

4 个答案:

答案 0 :(得分:3)

这实际上是不正确的。来电者将获得NSURLRequest*。您需要改为使用-mutableCopy

- (NSMutableURLRequest *)readonlyRequest {
    return [self.request mutableCopy];
}

或者,您应该将其声明为NSURLRequest *(这可能更好,除非您有理由认为调用者需要可变请求)。

修改:删除了关于autorelease的内容,因为问题已更新,表明这是ARC。

答案 1 :(得分:1)

通常如果它是只读的,你会返回一个不可变的副本 但是,这就是方式。
如果将readonly属性存储为不可变对象,由于它是不可变的,您只能发送该对象,调用者将无法修改您的对象。

答案 2 :(得分:1)

我不确定在概念上是否在readonly属性中使用mutableCopy是有意义的。也许有人可以提供一些例子来说明它何时填补我的想法中的一些空白?

  • 我不知道我不知道自从我收到它后我的对象是否已经变异
  • 如果我从类中收到一个我可以变异的对象,我通常会认为我正在改变类中的实例而不是副本。这可能会导致我做头疼,直到我仔细查看头文件才能看到发生了什么 - 当然这与readonly名称中包含@property的情况不相关,情况往往并非如此。

答案 3 :(得分:1)

我认为从语义上来说,从只读属性中获取可变结果是很奇怪的。只读的含义是不希望对象改变的类,但是你给了一个看似你可以这样做的对象 - 即使在幕后它真的是副本也不是预料到的。

除了属性之外,我只会将其作为mutableCopyOfMyData之类的访问器方法,而是让用户更愿意修改结果。