Objective c 如何通过间接方式传递(和设置)非对象?

Objective c 如何通过间接方式传递(和设置)非对象?,objective-c,pointers,indirection,multiple-indirection,Objective C,Pointers,Indirection,Multiple Indirection,NSError对象经常这样使用(取自): 我想实现类似于布尔间接寻址的功能: - (id)doStuff:(id)withAnotherObjc andExtraBoolResult:(BOOL **)extraBool; *extraBool = &YES; // ERROR! Address expression must be an lvalue or a function designator 但我不知道如何让它正常工作 对于涉及NSError的给定方法规范,正确的实现将涉及

NSError对象经常这样使用(取自):

我想实现类似于布尔间接寻址的功能:

- (id)doStuff:(id)withAnotherObjc andExtraBoolResult:(BOOL **)extraBool;
*extraBool = &YES; // ERROR! Address expression must be an lvalue or a function designator
但我不知道如何让它正常工作

对于涉及NSError的给定方法规范,正确的实现将涉及以下内容(同样来自):

使用类似的逻辑,这似乎应该适用于布尔间接寻址:

- (id)doStuff:(id)withAnotherObjc andExtraBoolResult:(BOOL **)extraBool;
*extraBool = &YES; // ERROR! Address expression must be an lvalue or a function designator

为什么这个方法不起作用?实现它的正确方法是什么?

请记住,对于对象,您使用的是一个指针(例如,
NSError*
),因此使用这个方法,您将得到一个指向指针的指针(例如,
NSError**
)。但是,在使用
BOOL
时,应该使用指向BOOL的指针:也就是说,只有一级间接寻址,而不是两级间接寻址。因此,你的意思是:

- (id)doStuff:(id)withAnotherObjc andExtraBoolResult:(BOOL *)extraBool;
随后:

*extraBool = YES;

请记住,对于对象,您使用的是指针(例如,
NSError*
),因此使用此方法,您将得到指向指针的指针(例如,
NSError**
)。但是,在使用
BOOL
时,应该使用指向BOOL的指针:也就是说,只有一级间接寻址,而不是两级间接寻址。因此,你的意思是:

- (id)doStuff:(id)withAnotherObjc andExtraBoolResult:(BOOL *)extraBool;
随后:

*extraBool = YES;

这正是我的第一次传球。但这样它就无法编译,所以我试图用对指针的理解来合理化它。我认为
*a=b
实际上会改变
a
指向包含
b
的内存,因此我认为这不适用于
BOOL
s,因为我假设每个
YES
NO
都是相同的内存;仔细想想,这是假的,
*a=b
显然只是更新
a
以指向包含
b
的内存。我真的不知道为什么它以前不会编译;现在很好用了,哎呀。事实上,这是不对的。
*a=b
所做的是取消对
a
的引用,并将结果设置为
b
,因此
a
不会改变(它仍然是指向内存中相同位置的指针);发生的情况是,内存中的同一点被重写为包含
b
。请检查NULL。如果它为NULL,并且这是不允许的,则抛出NSInvalidArgumentException。这正是我的第一次通过。但这样它就无法编译,所以我试图用对指针的理解来合理化它。我认为
*a=b
实际上会改变
a
指向包含
b
的内存,因此我认为这不适用于
BOOL
s,因为我假设每个
YES
NO
都是相同的内存;仔细想想,这是假的,
*a=b
显然只是更新
a
以指向包含
b
的内存。我真的不知道为什么它以前不会编译;现在很好用了,哎呀。事实上,这是不对的。
*a=b
所做的是取消对
a
的引用,并将结果设置为
b
,因此
a
不会改变(它仍然是指向内存中相同位置的指针);发生的情况是,内存中的同一点被重写为包含
b
。请检查NULL。如果它为NULL且不允许,则抛出NSInvalidArgumentException。