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

Posted

技术标签:

【中文标题】如何在目标 c 中创建 BOOL 实例变量?【英文标题】:How do I create a BOOL instance variable in objective c? 【发布时间】:2012-05-27 22:33:50 【问题描述】:

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

【问题讨论】:

试试:-(void)viewDidLoad BOOL flag = NO; 。此外,一旦您想在 .m 文件中声明,您就无法从 .m 文件中对其进行属性合成。 我应该在哪里定义flag?在 .m 文件中没有意义吗?但是,我无法弄清楚它的语法。谢谢 像在 .h 中一样定义 .m 类中的属性 .. 这将使该类的 bool 私有,无法从外部访问。 flag 是目标 c 中的 BOOL 实例变量,它是您想要的 .m 文件。它仅适用于 viewDidLoad 方法。 @Parth,那不是实例变量,那是局部变量,在实现文件中声明的实例变量当然可以有与之关联的声明属性。 【参考方案1】:

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

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

@implementation MyClass 
     BOOL _myBool;

我认为这是 iOS5 的新功能。但我也见过这样的代码:

@implementation MyClass 
@private
     BOOL _myBool;

希望这会有所帮助。

【讨论】:

"如果您将其设为属性,则它是公开的。"实际上,没有。可以在类扩展或类别中私下声明属性。 但如果你什么都不做,它们就是公开的。 如果你什么都不做,你什么都没有。决定方法或属性是否为公共的是它的声明位置。如果它在标题中声明,则它是公开可见的;否则不是。 (虽然没有运行时强制。)【参考方案2】:

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

【讨论】:

BOOL ivars 初始化为 YES?你想重新考虑一下这个说法吗?【参考方案3】:

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

【讨论】:

【参考方案4】:

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

你是否用它来做一个属性,取决于你想要什么。 作为属性,您可以稍后应用包括检查/守卫/任何内容的 setter/getter。 此外,您还可以应用键值访问。

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

【讨论】:

【参考方案5】:

我需要在我的一个目标 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:myBool 发送给MyClass 的对象。

【讨论】:

以上是关于如何在目标 c 中创建 BOOL 实例变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++11 中创建结构的编译时常量实例

如何在 Typescript 类中创建 Angular 5 HttpClient 实例

如何在 Java 中创建静态局部变量?

为啥在 Kivy 中创建方法时需要“实例”变量?

如何在 OS X 目标中创建 CFDictionary?

如何在 Swift 子类中引用目标 c 实例变量?