如果我有一个带有一些IBOutlets的类,那么为这些创建访问器似乎有些愚蠢。
但后来我觉得我打破OO做法并不总是通过实例变量的访问器。
对于一些不应公开的实例变量我也有同样的感觉,我宁愿不公开某些类的内部工作。我可以将实际的ivars设为私有,但@property简写似乎无法指定可见性。这导致我不创建访问器并直接访问ivars。我不确定这是否令人不悦。是吗?
社区对这个新手问题的看法是什么? (请忽略点语法)
答案 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