我应该始终使用Objective-C中的实例变量的访问器?(Should I always use

2019-07-20 22:12发布

如果我有一些IBOutlets的一类,它似乎有点傻创造这些访问。

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

我也有同样的感觉的一些实例变量,不应该是公开的,我宁愿不公开一些类的内部运作。 我可以使实际的ivars私人但@property速记似乎并不能够指定知名度。 这使我不能创建存取,只是直接访问实例变量。 我不知道如果这是在虽然皱起了眉头。 是吗?

什么是社会对这个无可否认的新手问题的想法? (请忽略点语法)

Answer 1:

我不知道直接访问实例变量,我想一个不应该,但对于一些变量,它只是没有意义使用存取。 喜欢的IBOutlet是你提到的。

我只能帮你出私人存取。 用Objective-C的2.0就可以开始申报扩展 。

类扩展是像“匿名”类别,除了它们申报方法必须在主来实现@implementation为相应的类块。

只要把这个扩展成一个单独的头文件,你就会有私人存取不在标题可见。



Answer 2:

公共/私人

你可以声明你的高德作为@interface文件是只读的,但随后在一个类别重新申报他们,让你的类可以改变它们。 这里有一个快速的介绍来分类 。

一个例子:

//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 /吸气语法改变。

真正的私有的ivars

如果你想保持高德真正私有的,只能直接访问它们,而无需通过@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


文章来源: Should I always use accessors for instance variables in Objective-C?