在Objective-C中,我是否应该总是使用访问器来访问实例变量?

6
如果我有一个带有一些IBOutlets的类,为这些创建访问器似乎有点愚蠢。
但是,如果不总是通过实例变量的访问器来访问它们,我感觉自己违反了面向对象的实践。
对于一些不应该公开的实例变量,我也有同样的感觉,我不想暴露某些类的内部工作方式。我可以将实际的ivars设为私有,但@property简写似乎无法指定可见性。这导致我不创建访问器,直接访问ivars。但我不确定这是否被认为是不好的做法。是吗?
社区对这个新手问题的看法是什么?(请忽略点语法)
2个回答

4

我不确定直接访问实例变量是否合适,我认为应该避免,但对于某些变量来说,使用访问器就没有意义了。比如你提到的IBOutlet

我只能帮你处理私有访问器。从Objective-C 2.0开始,你可以声明扩展

类扩展类似于“匿名”分类,不同之处在于它们声明的方法必须在相应类的主要@implementation块中实现。

只需将此扩展放入单独的头文件中,即可获得不在头文件中可见的私有访问器。


3

公共/私有

您可以在@interface文件中将iVars声明为只读,但然后在类别中重新声明它们,以便您的类可以更改它们。这里是一个关于类别的快速介绍

一个例子:

//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语法由类进行更改。

真正私有的实例变量

如果你想要将实例变量保持真正私有,并在不使用@property语法的情况下直接访问它们,则可以用@private关键字来声明它们。但是,你可能会说:“噢,但是他们仍然可以使用KVC方法(如setValueForKey:)在类外部获取值。”这种情况下,可以查看NSKeyValueCoding协议的类方法+ (BOOL)accessInstanceVariablesDirectly来停止这一操作。

IBOutlets作为属性

建议的方法是使用@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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接