Objective c “目标-c联盟”-&燃气轮机&引用;vs"&引用;
首先,我要说的是,我对结构和联合这件事还很陌生。在发布这篇文章之前,我已经做了功课,并且诚实地试图得到合理的澄清。如果这是错误的方式,请让我知道。首先,我试图创建一个联合,因为我正在组合不同的数据类型。我唯一真正的问题是点运算符与->。我可以通过使用Objective c “目标-c联盟”-&燃气轮机&引用;vs"&引用;,objective-c,c,Objective C,C,首先,我要说的是,我对结构和联合这件事还很陌生。在发布这篇文章之前,我已经做了功课,并且诚实地试图得到合理的澄清。如果这是错误的方式,请让我知道。首先,我试图创建一个联合,因为我正在组合不同的数据类型。我唯一真正的问题是点运算符与->。我可以通过使用 -> 但不是 . 我只是好奇为什么?我读了一堆文章,上面用“.”显示了一些例子或“答案”,但在现实世界中没有运气。我玩过“typedef”,比如 但这并不意味着有什么不同。如果有人能解释我做错了什么,我们将不胜感激。下面是我尝试做的一个快
->
但不是
.
我只是好奇为什么?我读了一堆文章,上面用“.”显示了一些例子或“答案”,但在现实世界中没有运气。我玩过“typedef”,比如
但这并不意味着有什么不同。如果有人能解释我做错了什么,我们将不胜感激。下面是我尝试做的一个快速示例。为了简单起见,我只发布一些结构/联合语法,不会添加任何子类代码,因为这不是问题
例h
#import "<Foundation/Foundation.h"
union myUnion
{
int intValue;
bool boolValue;
};
@interface MyClass : NSObject
{
union myUnion *someProperty;
}
@property (nonatomic, assign) union myUnion *someProperty;
-(void)doSomething;
@end
所以现在在我的另一节课上,这是有效的
MyClass *newObject = [MyClass alloc] init];
newObject.someProperty->intValue = 6;
但这不
MyClass *newObject = [MyClass alloc] init];
newObject.someProperty.intValue = 6;
此时此刻,我更感兴趣的是了解为什么后者不起作用?有趣的是,如果我去掉.h文件中属性的指针
@interface MyClass : NSObject
{
union myUnion someProperty;
}
@property (nonatomic, assign) union myUnion someProperty;
“.”代替“->”,但现在它不可赋值
作为旁注,如果我将bool更改为int并使其成为struct,同样的事情也会发生。不幸的是,我先是精通了objective-c,然后慢慢地学习了严格的c。所以我对c的理解有点弱,但这就是obc的优点,我可以用一种语言学习两种语言!如果你不算未结总账
我会问,是否有人可以发布一个代码的工作示例,然后我可以找出我做错了什么,或者彻底解释我做错了什么,以及我遗漏的一些基本概念。从那里我可以知道如何编写自己的工作代码。我不需要两者都有,也不希望有人伸出援手,但我想学习,这样我就可以解决自己的问题,而不仅仅是在不了解它如何工作或为什么工作的情况下修补错误代码 在这种情况下,很可能希望将union作为一个值,而不是指向外部内存位置的指针:
@interface MyClass : NSObject
{
union myUnion someProperty; // << no '*'
}
@end
如果它是指针:
someProperty->intValue = 6;
然而,还有另一个问题。有两个(主要)选项可将并集用作特性。值或指针。这通常由值处理,尤其是当所有字段都引用结构/联合的本地内存时,以及当字段id不大时。在这种情况下,您通常会返回并按值进行设置。这意味着您的程序将按如下方式编写:
@interface MyClass : NSObject
{
union myUnion someProperty;
}
@property (nonatomic, assign) union myUnion someProperty; // << by value
@end
这就是它通常是如何通过不涉及共享资源的小型结构来实现的
当然,如果您选择直接访问该字段,则当您的实例具有直接访问权限时,您不需要副本:
- (void)doSomething
{
++someProperty.intValue;
}
如果这变得复杂,最好将方法后面的数据抽象出来,并将访问和变异留给拥有联合的
MyClass
实例。a->b操作符是(*a)的简写形式。b
-这就像使用
但先进行解引用一样。当a
是指针时,它是合适的
因为在最初的示例中,someProperty
是指向联合的指针,所以需要首先取消对该指针的引用。这意味着您需要使用:
(*newObject.someProperty).intValue // confusing!
或
访问它
当然,一旦将someProperty
更改为联合而不是指向联合的指针,就可以使用
来代替。因此:
:访问指针上的结构/联合成员a->b
:访问原始结构/联合上的结构/联合成员a.b
@interface MyClass : NSObject
{
union myUnion someProperty;
}
@property (nonatomic, assign) union myUnion someProperty; // << by value
@end
union myUnion p = obj.someProperty;
++p.intValue;
obj.someProperty = p;
- (void)doSomething
{
++someProperty.intValue;
}
(*newObject.someProperty).intValue // confusing!
newObject.someProperty->intValue // much better