BOOL ivar应该是一个允许另一个类设置它的指针吗?

Ser*_*nce 3 encapsulation objective-c instance-variables declared-property

我的类有一个BOOL需要由另一个类设置的属性,所以我试图使用指针.我正在为此声明一个属性:

@interface SomeClass : SuperClass
{
    BOOL *_shared;
}
@property(nonatomic) BOOL *shared;
Run Code Online (Sandbox Code Playgroud)

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

*self.shared = YES;
Run Code Online (Sandbox Code Playgroud)

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

bbu*_*bum 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
Run Code Online (Sandbox Code Playgroud)

(注意保留周期 - 如果A以某种方式直接或间接地保留B,(strong)则从B对A 的引用将创建保留周期.[b setControllerA:nil]当您想要打破该周期时调用.)

现在,如果您仍然认为需要发送指向A到B内部状态的指针,请更新您的问题.

  • 完全同意.*很少*可能存在与性能相关的原因来破坏封装,但即使在这种情况下,传递`instanceA`并使用`instanceA-> shared`比将指针传递给成员变量更好. (2认同)

baz*_*zik 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
Run Code Online (Sandbox Code Playgroud)

  • 将简单的`BOOL` ivar转换为`NSNumber`是完全没必要的.这个答案消除了反模式,但并没有真正回答OP的问题. (5认同)