如何在Objective-C中创建一个BOOL实例变量?

21

我需要在我的Objective-C类中创建一个类型为BOOL并且默认值为False的实例变量。该如何操作?我看到有人将其定义在.h文件中,但我不需要让这个变量公开。所以应该将其放在.m文件中对吧?此外,我应该将其作为属性吗?是否存在不应该将某些东西作为属性的情况?谢谢。


尝试:`-(void)viewDidLoad { BOOL flag = NO; }`。另外,一旦你想在.m文件中声明它,你就不能从.m文件中合成它。 - Parth Bhatt
我应该在哪里定义 flag?在 .m 文件中定义不是很合理吗?但是,我无法弄清楚它的语法。谢谢 - Nosrettap
在.m类中像在.h中一样定义属性,这将使布尔值成为类的私有属性,无法从外部访问。 - iphonic
flag是Objective-C中的BOOL实例变量,它在.m文件中定义。它仅用于方法viewDidLoad。 - Parth Bhatt
@Parth,那不是实例变量,那是一个局部变量,而且在实现文件中声明的实例变量肯定可以有关联的声明属性。 - Jim
5个回答

27
我需要在我的Objective-C类中创建一个默认值为FALSE的BOOL类型实例变量。我该怎么做?
假设您正在使用当前的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

请注意,尽管编译器会对上述内容产生警告,但在运行时,任何类都可以向MyClass的对象发送setMyBool:myBool

14

如果你想创建一个私有变量,可以利用类别的功能。例如,创建一个名为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

BOOL可以通过简单的BOOL myBool来声明为实例变量,也可以通过@property (nonatomic, assign) BOOL myBool的方式声明为属性。需要注意的是,BOOL类型的值在初始化时会被赋值为NO(空值)。如果需要让BOOL类型可从其他类访问或在m文件中作为全局变量使用,可以将其声明为实例变量或属性,否则只需将它们声明为方法中的局部变量。


实例变量初始化为YES?你想重新考虑一下这个语句吗? - jrturton

1

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

是否将其作为属性取决于您的需求。 作为属性,您可以稍后应用包括检查/保护等的setter/getter。 此外,您还可以应用键值访问。

如果您不需要其中之一,则没有实际需要属性(但是这是一个好习惯:您永远不知道代码会如何发展)。


0
如果将其设置为属性,则它是公共的。如果您不希望变量是公共的,则不要使用属性。为什么不想公开?您可以拥有只读属性,并通过私有类别在.m中进行可写操作。
如果您使用iOS 5,则可以将其放入您的.m文件中。
@implementation MyClass {
     BOOL _myBool;
}

我觉得这是iOS5的新功能。但我也见过类似这样的代码:

@implementation MyClass {
@private
     BOOL _myBool;
}

希望这能有所帮助。

如果你将它作为属性,那么它就是公共的。实际上并不是这样的。属性可以在类扩展或分类中被声明为私有的。 - jlehr
但是如果你什么都不做,它们就是公开的。 - Pfitz
如果你什么都不做,就什么也得不到。决定一个方法或属性是否为公共的是它声明的位置。如果它在头文件中声明,那么它就是公开可见的;否则就不是。(虽然没有运行时强制执行。) - jlehr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接