21

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

4

5 回答 5

26

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

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

@implementation MyClass
{
@private
    BOOL myBool;
}

我见过人们在他们的 .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

请注意,尽管编译器会针对上述情况产生警告,但在运行时,任何类都setMyBool:可以myBoolMyClass.

于 2012-05-21T12:46:08.637 回答
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
于 2012-05-21T12:20:38.323 回答
2

BOOL 被声明为带有简单 的 iVar BOOL myBool,并被声明为带有@property (nonatomic, assign) BOOL myBool. 但请注意,布尔值初始化为 NO (nil)。如果您需要从其他类访问 BOOL 或 m 文件中的“全局”,请使用 iVar 或属性,否则只需在单个方法中将它们声明为作用域变量。

于 2012-05-21T12:19:51.950 回答
1

您可以将声明放入.m文件中。

您是否从中获得财产,取决于您想要什么。作为属性,您可以稍后应用包括检查/守卫/任何内容的 setter/getter。此外,您可以应用键值访问。

如果您不需要其中之一,那么就没有真正需要属性(但一个好的传统:您永远不知道您的代码将如何发展)。

于 2012-05-21T12:22:16.940 回答
0

如果您将其设为财产,则它是公开的。如果您不希望变量公开,则不要使用属性。为什么不想公开?您可以拥有 readonly 属性并通过私有类别在您的 .m 中写入。

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

@implementation MyClass {
     BOOL _myBool;
}

我认为这对 iOS5 来说是新的。但我也见过这样的代码:

@implementation MyClass {
@private
     BOOL _myBool;
}

希望这可以帮助。

于 2012-05-21T12:16:38.463 回答