如何在目标 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 实例变量?的主要内容,如果未能解决你的问题,请参考以下文章