我是否应该在Objective-C中始终使用访问器作为实例变量?
如果我有一个带有一些iboutlet的类,那么为这些类创建访问器似乎有点愚蠢 但是,我觉得我打破了OO实践,因为我不总是通过实例变量的访问器 对于一些不应该公开的实例变量,我也有同样的感觉,我宁愿不公开某些类的内部工作。我可以将实际的IVAR设置为私有,但@property速记似乎无法指定可见性。这导致我不创建访问器,而直接访问IVAR。我不确定这是否是不赞成的。是吗我是否应该在Objective-C中始终使用访问器作为实例变量?,objective-c,oop,Objective C,Oop,如果我有一个带有一些iboutlet的类,那么为这些类创建访问器似乎有点愚蠢 但是,我觉得我打破了OO实践,因为我不总是通过实例变量的访问器 对于一些不应该公开的实例变量,我也有同样的感觉,我宁愿不公开某些类的内部工作。我可以将实际的IVAR设置为私有,但@property速记似乎无法指定可见性。这导致我不创建访问器,而直接访问IVAR。我不确定这是否是不赞成的。是吗 社区对这个公认的新手问题有何看法?(请忽略点语法)我不确定是否直接访问实例变量,我认为不应该,但对于某些变量来说,使用访问器是没
社区对这个公认的新手问题有何看法?(请忽略点语法)我不确定是否直接访问实例变量,我认为不应该,但对于某些变量来说,使用访问器是没有意义的。就像你提到的
IBOutlet
s一样
我只能通过私人访问器来帮助你。从Objective-C2.0开始,您可以
类扩展类似于“匿名”
类别,方法除外
它们声明必须在
用于
对应的类
只需将此扩展名放入一个单独的头文件中,您将拥有头文件中不可见的私有访问器。Public/private 您可以将@interface文件中的IVAR声明为只读,但随后在类别中重新声明它们,以便您的类可以更改它们。这是一个例子 例如:
//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语法进行更改
真正的私人IVAR
如果您想让ivar真正私有化,并且只直接访问它们而不使用@property语法,那么可以使用@private
关键字声明它们。但是你会说“啊,但是他们总是可以使用KVC方法,比如setValueForKey:
”在这种情况下,看看NSKeyValueCoding协议类方法+(BOOL)accessInstanceVariables直接
,它停止了这一过程
IBOutlets作为属性
方法是使用@property和@synthesis。对于MacOSX,您可以将它们声明为只读属性。例如:
//MyClass.h
@interface MyClass : NSObject {
NSView *myView;
}
@property (readonly) IBOutlet NSView *myView;
@end
//MyClass.m
@implementation MyClass
@synthesize myView;
@end