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
    :访问原始结构/联合上的结构/联合成员

您和蒂莫西提供的答案陈述得非常精彩。谢谢你们两位。如果我能问一个后续问题。让我们来创建一个无处不在的“person”类。那个“人”有“头发”的属性。那头发有“长度”和“颜色”。所以如果我想设置person.hair.color=black;&person.hair.length=长;结构是正确的选择,还是我应该换一种方式?我想我想弄清楚的是如何创建“子属性”,然后设置并获取这些属性。@DoS对于非平凡的行为和数据,通常只使用objc类,而不是普通的c结构或联合。有了经验,您可以很容易地选择objc类、c结构或其他合适的设计。再次感谢您提供的信息。但就你的观点而言,我只是想学习不同的做事方法。可以说是“开阔我的视野”。我知道我可以用一个纯粹的o-c类来做这件事,但我很好奇还有什么别的方法可以做到。我想我仍然对我的伪“子属性”问题或语法有点困惑。使用“person”类示例,您基本上是说“hair”只是“person”类的一个子类。“长度”和“颜色”将只是hair子类的属性?我理解正确吗?@DoS这最终取决于复杂性和行为。一种结构(c结构或objc类)通常更适合于给定的任务或实现。对于person,您可能最终会发现hair.length最容易使用c类型表示,但hair具有多个属性,并且它可能具有将头发表示为对象所需的实现或多态行为,因此hair作为更复杂的表示形式可能更适合于类,而int可能用于length,颜色属性可以使用NSColor或UIColor。但是许多objc开发人员并没有将c限制到极限,除非性能或可移植性是一个问题。当更容易表示为objc类型(或集合,或…)时,它们只使用objc类型。
@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