我想阻止我的一个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的框架开发人员如何做到这一点?这只能用结构吗?我怎样才能达到类似的目的呢?
答案 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