如何在目标c中创建BOOL实例变量?

时间:2012-05-21 12:11:15

标签: objective-c ios xcode boolean

我需要在我的一个Objective-C类中创建一个类型为BOOL的实例变量,其默认值为False。我该怎么做呢?我见过人们在他们的.h文件中定义它但我真的不需要这个变量是公开的。因此,我不应该把它放在我的.m文件中?另外,我应该把它作为财产吗?或者我不应该做一些财产?感谢。

6 个答案:

答案 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:的对象发送myBoolMyClass

答案 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