Objective c 只读出口?
假设我有一节课。我想按以下方式申报财产:Objective c 只读出口?,objective-c,properties,readonly,setter,iboutlet,Objective C,Properties,Readonly,Setter,Iboutlet,假设我有一节课。我想按以下方式申报财产: 从类外部,如果以编程方式访问,它应该是只读的 应该可以使用插座从Interface Builder设置值 (从类内部来说,它应该是可写的,但我知道怎么做) 我提出的“解决方案”是编写一个一次性setter: - (void) setA: (ClassA *)a { if (aHaveBeenSet) return; else { // do what a setter have to do
- (void) setA: (ClassA *)a {
if (aHaveBeenSet)
return;
else {
// do what a setter have to do
aHaveBeenSet == YES;
}
}
但是这个setter仍然可以从代码中调用(虽然只调用一次),所以它不是一个很好的解决方案
另一种方法是将ivar标记为IBOutlet,并将属性设置为只读,如下所示:
@interface MyClass : NSObject {
IBOutlet ClassA *a;
}
@property (readonly) ClassA *a;
@end
但据他说,这是一种糟糕的风格,使内存管理变得不明确
有什么想法吗?如果我错了,有人会纠正我,但我认为只有在运行时实例化.NIB文件时,NIB加载机制才会检查setter方法。这意味着您可以将公共属性声明为只读,但可以在.m文件中编写“private”setter:
// MyClass.h
@property (readonly, retain) IBOutlet ClassA *a;
有关类扩展的更多信息,请参阅。这是否意味着nib加载代码将执行类似于
if([obj respondsToSelector:@selector(setA:)])[obj setA:a]
?如果是这样,尽管setter没有公开声明,条件是否会评估为YES
。第二个问题:当然可以。
// MyClass.m
@interface MyClass ()
@property (readwrite, retain) ClassA *a;
@end
@implementation MyClass
@synthesize a;
...
@end