我需要在我的一个Objective-C类中创建一个类型为BOOL
的实例变量,其默认值为False
。我该怎么做呢?我见过人们在他们的.h文件中定义它但我真的不需要这个变量是公开的。因此,我不应该把它放在我的.m文件中?另外,我应该把它作为财产吗?或者我不应该做一些财产?感谢。
答案 0 :(得分:23)
我需要在我的一个目标c类中创建一个BOOL类型的实例变量,其默认值为FALSE。我该怎么做?
假设您正在使用当前的Xcode,您可以在实现中声明ivar,如下所示:
@implementation MyClass
{
@private
BOOL myBool;
}
我见过人们在他们的.h文件中定义它但我真的不需要这个变量是公开的。
从历史上看,由于类的实现方式,您必须在@interface
中声明实例变量。现在只有在您将32位OS X作为目标时才需要这样做。
另外,我应该把它作为财产吗?
这取决于。如果它是类的外部API的一部分(对于不相关的类或子类要使用的话),你肯定应该把它作为属性。如果它只是对象内部状态的一部分,你不需要把它作为属性(我不要吨)。
或者我不应该做一些财产?感谢。
如果您不使用ARC并且类型是对象类型(BOOL不是),则应始终将其作为属性以利用合成访问器的内存管理。如果 使用ARC,那么Apple开发人员列表中的建议就是将属性作为API属性的一部分,以及作为ivars的内部状态。
请注意,即使对于内部状态,您可能还想使用KVO,在这种情况下,请使用属性。
如果将此BOOL声明为属性并进行合成,则无需显式声明ivar。如果要使属性仅对类本身“可见”,请使用类扩展
@interface MyClass()
@property (assign) BOOL myBool;
@end
@implementation MyClass
@synthesize myBool = myBool_; // creates an ivar myBool_ to back the property myBool.
@end
请注意,尽管编译器会针对上述内容生成警告,但在运行时,任何类都可以向setMyBool:
的对象发送myBool
或MyClass
。
答案 1 :(得分:13)
如果您想制作私人变量,可以使用类别的强大功能。 以MyClass为例,在.m文件中执行以下操作:
#import "MyClass.h"
@interface MyClass() //This is an empty category on MyClass class
@property (nonatomic, assign) BOOL myBool;
@end
@implementation MyClass
@synthesize myBool = _myBool;
-(void)myMethod {
self.myBool = YES; //this is using the property
_myBool = NO; //this is the instance variable, as @synthesize creates an instance variable for you
// both are private
}
@end
答案 2 :(得分:2)
BOOL被声明为具有简单BOOL myBool
的iVars,以及具有@property (nonatomic, assign) BOOL myBool
的属性。请注意,BOOLean值初始化为NO(nil)。如果您需要可以从其他类访问BOOL或m文件中的“global”,请使用iVar或属性,否则只需在单个方法中将它们声明为范围变量。
答案 3 :(得分:1)
您可以将声明放在.m
文件中。
你是否用它制作了一个属性,取决于你想要什么。 作为属性,您可以稍后应用包含检查/警卫/任何内容的setter / getter。 此外,您还可以应用键值访问。
如果你不需要其中一个,那么就不需要一个属性(但是一个好的传统:你永远不知道,你的代码将如何发展)。
答案 4 :(得分:0)
如果你把它作为财产,它是公开的。如果您不希望变量是公共的,那么请不要使用属性。你为什么不想公开?您可以拥有只读属性,并通过私人类别在您.m中写入。
如果使用iOS 5
,可以将其放在.m文件中@implementation MyClass {
BOOL _myBool;
}
我认为这是iOS5的新功能。但我也见过这样的代码:
@implementation MyClass {
@private
BOOL _myBool;
}
希望这会有所帮助。
答案 5 :(得分:0)
我使用0,1代替YES,NO
#define YES 1
#define NO 0