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

假设我有一节课。我想按以下方式申报财产:

  • 从类外部,如果以编程方式访问,它应该是只读的
  • 应该可以使用插座从Interface Builder设置值
  • (从类内部来说,它应该是可写的,但我知道怎么做)
  • 我提出的“解决方案”是编写一个一次性setter:

    - (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