Iphone 有没有一种方法可以为NSObjects设置变量而不为每个对象创建属性?
基本上,我有一个带有很多布尔变量的自定义NSObject。我想知道是否有一种方法可以在不为每个变量创建属性的情况下(从类外部)修改这些变量。这可能吗?提前谢谢! 这是我的对象标题的一部分:Iphone 有没有一种方法可以为NSObjects设置变量而不为每个对象创建属性?,iphone,objective-c,ios,Iphone,Objective C,Ios,基本上,我有一个带有很多布尔变量的自定义NSObject。我想知道是否有一种方法可以在不为每个变量创建属性的情况下(从类外部)修改这些变量。这可能吗?提前谢谢! 这是我的对象标题的一部分: @interface Polygons : NSObject { //BOOL values for attributes BOOL parallelogram; BOOL rhombus; BOOL square; ... } 可以使用KVC,例如: BOOL isParallelogram = [
@interface Polygons : NSObject {
//BOOL values for attributes
BOOL parallelogram;
BOOL rhombus;
BOOL square;
...
}
可以使用KVC,例如:
BOOL isParallelogram = [[myPolygon valueForKey:@"parallelogram"] boolValue];
(请参见《键值编码编程指南》中的)
也就是说,我不推荐这种方法。它不仅效率低下,而且还会断裂。这正是属性的用途,在这种情况下没有理由不使用它们。您可以声明它们
@public
:
@interface Polygons : NSObject {
@public
//BOOL values for attributes
BOOL parallelogram;
BOOL rhombus;
BOOL square;
...
然后像这样访问它们:
mypolygon->square = NO;
然而,正如@omz所解释的,这破坏了封装
您可以编写一个简单的脚本来为您生成属性。这是一个起点:
grep "BOOL [a-zA-Z0-9_]+;$" Polygons.h
你能不能创建一个方法,它接受变量的名称和值,然后分配给它?使用位掩码来表示一组相关的布尔属性。首先,定义一个枚举,如下所示:
enum GeometryFlags {
Parallelogram = 1 << 0,
Rhombus = 1 << 1,
Square = 1 << 2,
// etc.
};
然后,您可以定义一个属性以允许外部调用方访问位掩码:
// In .h file:
@property (nonatomic) GeometryFlags geometryFlags;
// In .m file:
@synthesize geometryFlags = _geometryFlags;
然后调用代码可以访问属性以获取或设置位字段。请注意,可以使用按位或运算符指定多个值:
// Uses the property accessor to modify two values in the bitmask.
someObj.geometryFlags = Parallelogram | Rhombus;
编辑
有关如何使用位掩码的详细信息,请参见以下内容:
谢谢你的回复和建议,我可能会写下这段脚本。另外请注意,当使用->操作符时,如果多边形为零,你的应用程序将崩溃。谢谢你的想法!但是,我不熟悉位字段和枚举。你能提供一个链接,我可以在那里读到它们吗?再次感谢@Garrett回想起来,我应该说“位掩码”而不是“位域”。我已经相应地更新了我的答案,还为你添加了一些链接。非常感谢!现在这更有意义了
// Uses the property accessor to modify two values in the bitmask.
someObj.geometryFlags = Parallelogram | Rhombus;