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

我是否应该在Objective-C中始终使用访问器作为实例变量?,objective-c,oop,Objective C,Oop,如果我有一个带有一些iboutlet的类,那么为这些类创建访问器似乎有点愚蠢 但是,我觉得我打破了OO实践,因为我不总是通过实例变量的访问器 对于一些不应该公开的实例变量,我也有同样的感觉,我宁愿不公开某些类的内部工作。我可以将实际的IVAR设置为私有,但@property速记似乎无法指定可见性。这导致我不创建访问器,而直接访问IVAR。我不确定这是否是不赞成的。是吗 社区对这个公认的新手问题有何看法?(请忽略点语法)我不确定是否直接访问实例变量,我认为不应该,但对于某些变量来说,使用访问器是没

如果我有一个带有一些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