2

假设我有一堂课。我想通过以下方式声明一个属性:

  1. 从类外部,如果以编程方式访问,它应该是只读的;
  2. 应该可以使用插座从 Interface Builder设置值;
  3. (从课堂内部它应该是可写的,但我知道该怎么做)。

我想出的“解决方案”是写一个一次性设置器:

- (void) setA: (ClassA *)a {
    if (aHaveBeenSet)
        return;
    else {
        // do what a setter have to do
        aHaveBeenSet == YES;
    }
}

但是这个 setter 仍然可以从代码中调用(虽然只有一次有效),所以它不是一个很好的解决方案。

另一种方法是将 ivar 标记为 IBOutlet 并使属性readonly如下所示:

@interface MyClass : NSObject {
     IBOutlet ClassA *a;
}
@property (readonly) ClassA *a;
@end

但是根据这个答案,这是一种糟糕的风格,并且使内存管理不清楚。

有任何想法吗?

4

1 回答 1

3

如果我错了,有人纠正我,但我认为NIB 加载机制仅在运行时实例化 .nib 文件时检查设置方法。所以这意味着您可以将您的公共属性声明为只读,但在您的 .m 文件中编写一个“私有”设置器:

// MyClass.h
@property (readonly, retain) IBOutlet ClassA *a;

// MyClass.m
@interface MyClass ()
@property (readwrite, retain) ClassA *a;
@end

@implementation MyClass
@synthesize a;
...
@end
于 2011-05-16T21:51:10.150 回答