加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – BOOL ivar应该是一个允许另一个类设置它的指针吗

发布时间:2020-12-16 10:51:21 所属栏目:百科 来源:网络整理
导读:我的类有一个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,那么从B对(强)引用A将创建一个保留周期.当你想打破那个周期时,调用[b setControllerA:nil]. )

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读