5

首先让我说我对整个结构和联合的事情都很陌生。在发布此内容之前,我已经完成了我的功课,并诚实地试图得到合法的澄清。如果这是错误的方法,请告诉我。首先,我试图创建一个联合,因为我正在组合不同的数据类型。我唯一真正的问题/问题是点运算符与->。我可以使用

->

但不是

.

我只是好奇为什么?iv 阅读堆栈上的一堆帖子,这些帖子使用“。”显示示例或“答案”,但在现实世界中没有运气。我玩过“typedef”之类的......

typedef union _myUnion
{
     int intValue;
     bool boolValue;
}myUnion;

但这似乎并没有什么不同。如果有人解释我做错了什么,将不胜感激。这是我正在尝试做的一个快速示例。为了简单起见,我将只发布一些结构/联合语法,并且不会添加任何子类代码,因为这不是问题。

例子.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

例子.m

#import "MyClass.h"

@implementation MyClass

@synthesize someProperty = _someProperty;

- (id)init
{
//Some init method...
}

- (void)doSomething
{
    NSLog(@"I Did Something...");
}

@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 并使其成为结构,则会发生同样的事情。不幸的是,我首先精通了objective-c,并且随着我的学习逐渐掌握了严格的c。所以我对 c 的理解有点薄弱,但这就是 obc 的美妙之处,我可以以一种语言的价格学习两种语言!如果你不计算open-gl。

我会问,是否有人可以发布一个代码的工作示例,然后我可以找出我做错了什么,或者彻底解释我做错了什么以及我错过的一些基本概念。从那里我可以弄清楚如何编写自己的工作代码。我不需要两者,也不指望伸出援助之手,但我想学习,这样我就可以解决自己的问题,而不仅仅是在不了解它的工作原理或原因的情况下修补有缺陷的代码。

4

2 回答 2

8

a->b运算符是简写-这(*a).b就像使用.但首先进行取消引用。当a是一个指针是合适的。

由于在您的原始示例someProperty中是指向联合的指针,因此您需要首先取消引用该指针。这意味着您需要使用:

(*newObject.someProperty).intValue // confusing!

或者

newObject.someProperty->intValue // much better

访问它。

当然,一旦您更改someProperty为联合而不是指向联合的指针,您就可以使用 the.代替。所以:

  • a->b: 访问指针上的结构/联合成员
  • a.b: 访问原始结构/联合上的结构/联合成员
于 2012-04-26T00:35:07.727 回答
5

在这种情况下,您很可能希望联合作为一个值——而不是指向外部内存位置的指针:

@interface MyClass : NSObject
{
    union myUnion someProperty; // << no '*'
}

@end

然后您使用期限进行会员访问:

someProperty.intValue = 6;

如果它是一个指针:

someProperty->intValue = 6;

但是,还有另一个问题。您有两个(主要)选项可以将联合用作属性。值或指针。这通常由值处理,特别是当所有字段都引用结构/联合本地的内存时,并且当字段 id 不大时。在这种情况下,您通常会返回并按值设置。这意味着您的程序将编写如下:

@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;
}

如果这变得复杂,那么抽象方法背后的数据可能是个好主意,并将访问和变异留给MyClass持有联合的实例。

于 2012-04-26T00:34:59.983 回答