BOOL变量是否应该是允许其他类设置它的指针?



我的类有一个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,那么从B到a的(strong)引用将创建一个保留循环。当您想要打破这个循环时,调用[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

No。正确的方法是声明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,只是传递一个指针到someeclass的实例,并设置它像这样:

someInstance.shared = YES;

相关内容

最新更新