Objective c 如何通过间接方式传递(和设置)非对象?
NSError对象经常这样使用(取自): 我想实现类似于布尔间接寻址的功能: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的给定方法规范,正确的实现将涉及
- (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。