阻止API用户设置属性的属性

时间:2014-07-15 19:03:57

标签: objective-c cocoa-touch cocoa properties

我想阻止我的一个Objective-C对象的用户设置对象属性的属性。就像无法设置origin frame的{​​{1}}一样。我出于同样的原因需要这个:能够在属性的setter上管理一些副作用。

示例:

UIView

现在不应该通过调用:

直接设置分钟
@interface Time : NSObject
@property (nonatomic) NSInteger hours;
@property (nonatomic) NSInteger minutes;
@end

@interface Watch : NSObject
@property (nonatomic) Time *time;
@end

......而不是:

watch.time.minutes = 15;

尝试设置Time *time = watch.time; // [watch.time copy]? time.minutes = 15; watch.time = time; // Here, in setTime:, I can implement some side effects UIView的大小时,编译器会这样抱怨:“表达式不可分配”。 Apple的框架开发人员如何做到这一点?这只能用结构吗?我怎样才能达到类似的目的呢?

2 个答案:

答案 0 :(得分:1)

我看到了几个选项:

通过从其获取者返回time副本来完全禁止更改。您必须记录这种情况发生的事实,并且可能违反最少惊喜的原则。

使用KVO允许Watch个实例对其Time成员已被修改的事实作出反应。只要修改通过Time的设置器(对于这种情况必须这样),Watch可以执行observeValueForKeyPath:ofObject:change:context:

最后,考虑Time甚至是否需要是可变的。可能你的代码只是一个例子,但Time似乎是一个值类型。一般来说,在Cocoa中,这些都不是可变的。将您不希望修改为Time的{​​{1}}属性更改为您和API用户都可以很好地解决此问题。

答案 1 :(得分:1)

只需将readonly添加到属性:

@property (nonatomic, readonly) NSInteger hours;

然后将属性设置为在* .m文件中读写:

@property (nonatomic, readwrite) NSInteger hours;

添加自定义初始化程序,如:

-(id)initWithHours:(NSInteger)hours andMinutes:(NSInteger)min