我的类有一个BOOL
需要由另一个类设置的属性,所以我正在尝试使用指针。我正在为它声明一个属性,如下所示:
@interface SomeClass : SuperClass
{
BOOL *_shared;
}
@property(nonatomic) BOOL *shared;
这是正确的方法吗?然后我只需像这样设置和访问值:
*self.shared = YES;
还是将其设置为可保留属性的正确方法?
我的类有一个BOOL
需要由另一个类设置的属性,所以我正在尝试使用指针。我正在为它声明一个属性,如下所示:
@interface SomeClass : SuperClass
{
BOOL *_shared;
}
@property(nonatomic) BOOL *shared;
这是正确的方法吗?然后我只需像这样设置和访问值:
*self.shared = YES;
还是将其设置为可保留属性的正确方法?
不,您不想发送指向实例变量的指针,以便其他类可以设置实例变量。这样做很脆弱并且会破坏封装。这是一个糟糕的设计模式。
这也是完全没有必要的。
如果实例 A 可以向实例 B“发送指针”,那么实例 A 可以轻松地将对自身的引用发送到实例 B。从那里,实例 B 可以简单地执行[instanceA setShared:YES];
.
@interface B:UIViewController
@property(strong) A *controllerA;
@end
@interface A:UIViewController
@property BOOL dogDoorEnabled;
@end
@implementation A
...
- (void) doSomething
{
B *b = .... get an instance of B ...;
[b setControllerA: self];
}
@end
@implementation B
...
- (void) doSomethingElse
{
BOOL isCheeseOnFire = ... calculate whether the cheese is burning ...;
[[self controllerA] setDogDoorEnabled: !isCheeseOnFire];
}
@end
(注意保留循环——如果 A 以某种方式直接或间接保留 B,那么(strong)
从 B 对 A 的引用将创建一个保留循环。[b setControllerA:nil]
当你想打破这个循环时调用。)
现在,如果出于某种原因您仍然认为需要将指向 A 的内部状态的指针发送到 B,请更新您的问题。
我会用
@interface SomeClass { }
@property(nonatomic) NSNumber *shared;
...
self.shared = [NSNumber numberWithBool:YES]; // in the other class
if ([self.shared boolValue]) {...} // in SomeClass where you want to find what is set
不,正确的方法是声明 BOOL 而不是指向 BOOL 的指针。当您想将指向 BOOL 的指针发送到下一个 viewController 时,您可以使用运算符 & 发送变量的地址。
在您的界面中:
@interface SomeClass {
BOOL _shared
}
@property (assign) BOOL _shared ;
在您的实施中:
[nextViewController setPointerToBool: &_shared] ;
正如其他人所说,您应该只使用 BOOL 而不是指向 BOOL 的指针。让它成为一个assign
变量,你可以简单地分配给它并直接读取它。此外,在现代编译器中,您不需要声明实例变量,这似乎是一个好习惯。
@interface SomeClass
@property (assign) BOOL shared;
@end
在您的实施中:
self.shared = YES;
当涉及到您的视图控制器时,不是将指针传递给 BOOL,而是将指针传递给 SomeClass 的实例,并将其设置如下:
someInstance.shared = YES;