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

Nos*_*tap 16 xcode boolean objective-c ios

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

Jer*_*myP 23

我需要在我的一个目标c类中创建一个BOOL类型的实例变量,其默认值为FALSE.我该怎么做呢?

假设您正在使用当前的Xcode,您可以在实现中声明ivar,如下所示:

@implementation MyClass
{
@private
    BOOL myBool;
}
Run Code Online (Sandbox Code Playgroud)

我见过人们在他们的.h文件中定义它但我真的不需要这个变量是公开的.

从历史上看,@interface由于实现类的方式,您必须在实例中声明实例变量.仅当您的目标是32位OS X时,现在才需要这样做.

另外,我应该把它作为财产吗?

那要看.如果它是类的外部API的一部分(对于不相关的类或子类要使用的话),你肯定应该把它作为属性.如果它只是对象内部状态的一部分,你不需要把它作为属性(我不要T).

或者我不应该做一些财产?谢谢.

如果您不使用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
Run Code Online (Sandbox Code Playgroud)

请注意,虽然编译器会为上面的内容生成警告,但在运行时,任何类都可以发送setMyBool:myBool发送对象MyClass.


gra*_*ver 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
Run Code Online (Sandbox Code Playgroud)