objective-c union“ - >” vs“。”

时间:2012-04-26 00:03:03

标签: objective-c c

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

获得我想要的工作
->

但不是

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

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

但这并不能解决问题。如果有人解释我做错了什么,将不胜感激。这是我想要做的快速示例。为了简单起见,我将发布一些struct / union语法,并且不会添加任何子类代码,因为这不是问题。

example.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

example.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;

“。”工作而不是“ - &gt;”,但现在它不可分配。

作为旁注,如果我将bool更改为int并使其成为结构,则会发生同样的事情。不幸的是,我首先熟练掌握了Objective-c,并且随着我的进展慢慢地接受了严格的c。所以我对c的理解有点弱,但这就是obc的美妙,我以一个人的价格学习两种语言!如果你不算open-gl。

我会问,如果有人可以发布一个代码的工作示例,然后我可以弄清楚我做错了什么,或者彻底解释我做错了什么以及我错过了一些基本概念。从那里我可以弄清楚如何编写自己的工作代码。我不需要两者,并且不希望分发但是想学习,所以我可以解决我自己的问题,而不仅仅是修补错误的代码,而不理解它是如何工作或为什么工作。

2 个答案:

答案 0 :(得分:7)

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

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

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

或者

newObject.someProperty->intValue // much better

访问它。

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

  • a->b:访问指针
  • 上的struct / union成员
  • a.b:访问原始struct / union
  • 上的struct / union成员

答案 1 :(得分:4)

在这种情况下,您很可能希望将union作为值 - 而不是指向外部存储器位置的指针:

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

@end

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

someProperty.intValue = 6;

如果它是指针:

someProperty->intValue = 6;

然而,还有另一个问题。您有两个(主要)选项可以将union用作属性。值或指针。这通常由值处理,尤其是当所有字段引用结构/联合的本地内存时,以及字段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实例。