2012-05-21 194 views
12

我需要在我的Objective-C类之一的False默认值创建BOOL类型的实例变量。我该怎么做呢?我已经看到人们在他们的.h文件中定义它,但我并不需要这个变量是公开的。因此,我不应该把它放在我的.m文件中?另外,我应该让它成为一个物业吗?或者我应该永远不要制造某种财产?谢谢。如何在目标c中创建一个BOOL实例变量?

+0

尝试:' - (无效)viewDidLoad中{ BOOL标志= NO; ''。另外,一旦你想声明.m文件,你不能从.m文件中进行属性合成。 –

+0

我应该在哪里定义'flag'?在.m文件中没有意义吗?但是,我无法弄清楚它的语法。 Thx – Nosrettap

+0

在.h类中定义属性,就像在.h中所做的那样。它将使该类对于不能从外部访问的类非常私密。 – iphonic

回答

21

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

@implementation MyClass 
{ 
@private 
    BOOL myBool; 
} 

我见过的人把它定义在他们的.h文件,但我不”:

假设你正在使用当前的Xcode,你可以在这样的实施申报伊娃真的需要这个变量是公开的。

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

此外,我应该让它成为一个属性吗?

这取决于。如果它是你的类的外部API的一部分(对于不相关的类或子类可以使用,那么你应该明确地将它作为属性)如果它只是对象内部状态的一部分,则不需要将它作为属性(并且我不' T)。

或者我应该永远不会让什么属性?谢谢。

如果你不使用ARC和类型为对象类型(BOOL是不是),你应该总是使它如果你使用ARC,你的,Apple开发人员列表中的建议是制作属于API属性的内容以及作为ivars的内部状态。

请注意,即使对于内部状态,您可能也想使用KVO,在这种情况下,请使用属性。

如果将此BOOL声明为属性并合成它,则不需要显式声明伊娃。如果你想使财产“可见”只类本身,使用类扩展

@interface MyClass() 

@property (assign) BOOL myBool; 

@end 

@implementation MyClass 

@synthesize myBool = myBool_; // creates an ivar myBool_ to back the property myBool. 

@end 

需要注意的是,尽管编译器会产生警告,针对上述情况,在运行时,任何类都可以发送setMyBool:myBoolMyClass的对象。

0

如果你使它成为一个财产,它是公开的。如果你不想让变量公开,那么不要使用属性。你为什么不想公开?您可以拥有只读属性,并通过私有类别在您的.m中进行写入。

你可以把它放到你的.m文件,如果使用的iOS 5

@implementation MyClass { 
    BOOL _myBool; 
} 

我觉得这是一个新的iOS5。但我也看过这样的代码:

@implementation MyClass { 
@private 
    BOOL _myBool; 
} 

希望这会有所帮助。

+0

“如果你把它变成财产,它就是公开的。”其实,没有。属性可以在类扩展或类别中私下声明。 – jlehr

+0

但是如果你什么都不做,他们是公开的。 – Pfitz

+0

如果你什么都不做,你什么都没有。什么决定一个方法或一个属性是否公开就是它的声明。如果它在标题中声明,它是公开可见的;否则它不是。 (虽然没有运行时执行。) – jlehr

2

BOOL的声明为iVars,简单的BOOL myBool,以及作为@property (nonatomic, assign) BOOL myBool的财产。但请注意,BOOLean值初始化为NO(零)。如果需要可以从其他类访问BOOL,或者在m文件中使用“全局”,请使用iVar或属性,否则只需在单独的方法中将它们声明为范围变量。

+0

BOOL ivars初始化为YES?你想重新思考这个说法吗? – jrturton

+0

你相信吗?自动更正? – CodaFi

11

如果你想制作一个私有变量,你可以使用类别的力量。 作出榜样,在.m文件类MyClass的执行以下操作:

#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 
1

你可以把声明中.m文件。

无论你制作一个属性,取决于你想要的。 作为一个财产,你可以在以后申请包括检查/守卫/任何的setter/getter。 另外,您可以应用键值访问。

如果你不需要其中的一个,那么就不需要一个属性(但是一个好传统:你永远不知道,你的代码将如何演化)。

0

我使用0,1代替YES,NO

#define YES 1 
#define NO 0