3

我的类有一个BOOL需要由另一个类设置的属性,所以我正在尝试使用指针。我正在为它声明一个属性,如下所示:

@interface SomeClass : SuperClass
{
    BOOL *_shared;
}
@property(nonatomic) BOOL *shared;

这是正确的方法吗?然后我只需像这样设置和访问值:

*self.shared = YES;

还是将其设置为可保留属性的正确方法?

4

4 回答 4

11

不,您不想发送指向实例变量的指针,以便其他类可以设置实例变量。这样做很脆弱并且会破坏封装。这是一个糟糕的设计模式。

这也是完全没有必要的。

如果实例 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,请更新您的问题。

于 2013-05-09T12:35:43.733 回答
5

我会用

@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
于 2013-05-09T12:27:22.950 回答
3

不,正确的方法是声明 BOOL 而不是指向 BOOL 的指针。当您想将指向 BOOL 的指针发送到下一个 viewController 时,您可以使用运算符 & 发送变量的地址。

在您的界面中:

@interface SomeClass {
    BOOL _shared
}

@property (assign) BOOL _shared ;

在您的实施中:

[nextViewController setPointerToBool: &_shared] ;
于 2013-05-09T12:24:34.930 回答
2

正如其他人所说,您应该只使用 BOOL 而不是指向 BOOL 的指针。让它成为一个assign变量,你可以简单地分配给它并直接读取它。此外,在现代编译器中,您不需要声明实例变量,这似乎是一个好习惯。

@interface SomeClass

@property (assign) BOOL shared;

@end

在您的实施中:

self.shared = YES;

当涉及到您的视图控制器时,不是将指针传递给 BOOL,而是将指针传递给 SomeClass 的实例,并将其设置如下:

someInstance.shared = YES;
于 2013-05-09T13:01:46.190 回答