Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c BOOL ivar应该是允许另一个类设置它的指针吗?_Objective C_Encapsulation_Instance Variables_Declared Property - Fatal编程技术网

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

Objective c BOOL ivar应该是允许另一个类设置它的指针吗?,objective-c,encapsulation,instance-variables,declared-property,Objective C,Encapsulation,Instance Variables,Declared Property,我的类有一个BOOL属性,需要由另一个类设置,所以我尝试使用指针。我为它声明一个属性,如下所示: @interface SomeClass : SuperClass { BOOL *_shared; } @property(nonatomic) BOOL *shared; someInstance.shared = YES; 这是正确的方法吗?然后我简单地设置并访问如下值: *self.shared = YES; 还是将其设置为可保留属性的正确方法?否。正确的方法是声明布尔,而不是

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

@interface SomeClass : SuperClass
{
    BOOL *_shared;
}
@property(nonatomic) BOOL *shared;
someInstance.shared = YES;
这是正确的方法吗?然后我简单地设置并访问如下值:

*self.shared = YES;

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

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

在您的界面中:

@interface SomeClass {
    BOOL _shared
}

@property (assign) BOOL _shared ;
在您的实施中:

[nextViewController setPointerToBool: &_shared] ;
self.shared = YES;
我会用

@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

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

这也是完全没有必要的

如果实例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]
。)


现在,如果出于某种原因,您仍然认为需要向B发送指向a内部状态的指针,请更新您的问题。

正如其他人所说,您应该使用布尔而不是指向布尔的指针。将其设为
assign
变量,您只需将其赋值并直接读取即可。此外,在现代编译器中,您不需要声明实例变量,而且不声明实例变量似乎是一种很好的做法

@interface SomeClass

@property (assign) BOOL shared;

@end
在您的实施中:

[nextViewController setPointerToBool: &_shared] ;
self.shared = YES;
当涉及到视图控制器时,不要传递指向BOOL的指针,只需传递指向SomeClass实例的指针,并将其设置为:

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

只是一张小纸条。。。您可以使用新的文本语法,因此可以编写:self.shared=@(YES);这是一个很好的答案。养成使用NSNumber的习惯,因为它将使您将来使用CoreData的生活更加轻松。;-)完全不需要将简单的
BOOL
ivar转换为
NSNumber
。这个答案消除了反模式,但并没有真正回答OP的问题也可以。虽然使用的模式很糟糕,但这是一个非常好的问题。这一评论是为了防止最近一连串的问题被否决,这些问题都是有效的,但都是关于如何实施反模式的问题。请不要否决这个问题。OP可能做了错事,但这不同于它是一个坏问题。@alastair-嗯,我在问什么是正确的事情。你说的是我上面所做的是错误的,还是在两个ViewController之间传递布尔指针是错误的?@StackOverFlowRider请看下面bbum的答案。传递
BOOL
指针几乎肯定是错误的。如果您在某处为
BOOL
分配内存,这是正确的。完全同意。很少会有与性能相关的原因来破坏封装,但即使在这种情况下,传递
instanceA
并使用
instanceA->shared
也比传递指向成员变量的指针要好。请更正BOOL声明。但是使用实例变量的地址作为编辑对象状态的手段是完全错误的。@bbum,是的,这不是明智的做法。但这正是他所要求的。OP需要从其他类设置变量。因此,
self.shared=
不起作用。他没有与该部分相关的代码,因此很难提供一个简洁的示例。我又加了一行。