我应该总是在Objective-C中使用访问器作为实例变量吗?

时间:2009-10-05 11:55:03

标签: objective-c oop

如果我有一个带有一些IBOutlets的类,那么为这些创建访问器似乎有些愚蠢。

但后来我觉得我打破OO做法并不总是通过实例变量的访问器。

对于一些不应公开的实例变量我也有同样的感觉,我宁愿不公开某些类的内部工作。我可以将实际的ivars设为私有,但@property简写似乎无法指定可见性。这导致我不创建访问器并直接访问ivars。我不确定这是否令人不悦。是吗?

社区对这个新手问题的看法是什么? (请忽略点语法)

2 个答案:

答案 0 :(得分:4)

我不确定直接访问实例变量,我认为不应该,但对于某些变量,使用访问器是没有意义的。就像你提到的IBOutlet一样。

我只能帮助您使用私人访问者。从Objective-C 2.0开始,您可以declare extensions

  

类扩展就像“匿名”   类别,除了方法   他们宣布必须实施   主要的@implementation块   相应的班级。

只需将此扩展程序放入单独的头文件中,您就会拥有在标题中看不到的私有访问者。

答案 1 :(得分:3)

公开/私人

您可以将@interface文件中的iVars声明为只读,但然后在类别中重新声明它们,以便您的类可以更改它们。这是一个quick intro to Categories

一个例子:

//MyClass.h

@interface MyClass : NSObject {
    NSString *name;
}
@property (readonly) NSString *name;

@end

在实施文件中,您可以重新声明:

//MyClass.m
@interface MyClass () //declare the class extension

@property (readwrite, copy) NSString *name; //redeclare the property

@end

@implementation MyClass

@synthesize name;

@end

现在,name属性只读取在类外部,但可以通过属性语法或setter / getter语法更改类。

非常私密的iVars

如果您想让iVars保持私密状态并且只是直接访问它们而不通过@property语法,您可以使用@private关键字声明它们。但是你说“啊,但是他们总是可以使用像setValueForKey:这样的KVC方法获取类外的值”在这种情况下,请看一下阻止它的NSKeyValueCoding协议类方法+ (BOOL)accessInstanceVariablesDirectly。 / p>

IBOutlets作为属性

recommended方式是使用@property和@synthesize。对于Mac OS X,您只需将它们声明为只读属性即可。例如:

//MyClass.h

@interface MyClass : NSObject {
    NSView *myView;
}
@property (readonly) IBOutlet NSView *myView;

@end

//MyClass.m

@implementation MyClass

@synthesize myView;

@end