3

我有这个:

typedef struct objTag{
    float x;
    float y;
    BOOL isUP;
} object;

如何使对象成为这样的属性

@property (nonatomic, assign) object myObj;

接着...

@synthesize myObj = _myObj;

这编译得很好,但是稍后在我尝试类似的代码时

self.myObj.isUP = YES;

我收到消息“表达式不可分配”

4

3 回答 3

6

这不起作用,因为编译器会将其编译为:

[[self getMyOj] setIsUP: YES];

您会注意到“isUP”是 C 结构而不是 Obj-C 对象 ivar 上的属性。

编辑:

如果您真的想要直接操作,则需要像这样进行操作。

typedef struct s {
    int i;
} s;

@interface Test : NSObject {
    s *myS;
}
@property (nonatomic, assign) s *myS;
@end

@implementation Test
@synthesize myS;
- (id) init {
    self = [super init];
    myS = malloc(sizeof(s));
    myS->i = 0;
    return self;
}
@end


// somewhere later.
Test *t = [[Test alloc] init];
t.myS->i = 10;

请注意,您可能希望在您的 dealloc 方法中清理 myS 。

于 2013-02-14T18:07:36.963 回答
3

这个问题回到了C编程的基础(即非面向对象编程)。

当您使用引用结构的属性时,您获取的是该结构的副本,而不是对其的引用。

如果你写

CGRect rect = CGRectMake(...);
CGRect rect2 = rect;

您没有分配rect2对 的引用rect,而是在创建结构的副本。变rect2不变rect

同样,如果您更改作为属性返回的结构的元素,您将更改对象拥有的 rect 副本的元素。从字面上看,这并没有什么好处——这种代码没有用处,因为您正在更改结构中没有引用任何地方的元素的值。

如果您想编辑该类实际使用的结构,您的属性需要返回一个指向它的指针。这可以做到,但代码变得比它的价值更混乱:

typedef struct myObj{BOOL isUp;} TOBJECT;
...
@property (nonatomic, assign) TOBJECT* myObj; //in class interface

...

self.myObj = malloc(sizeof(TOBJECT)); //in init method.
...
self.myObj->isUp = YES; //elsewhere, even potentially outside the class.
...
free(self.myObj); //in class dealloc method.
于 2013-02-14T17:59:16.553 回答
0

这就像处理 UIViews 上的帧一样 - 您需要一次性分配整个结构,而不是它的子值。所以像:

object obj = self.myObj;
obj.isUP = YES;
self.myObj = obj;

如果您不喜欢这样(这很糟糕!),请不要使用结构。而是构建一个具有几个属性的类。结构真的就在那里,因为 obj-c 是 c 的超集,如果可以的话,你应该避免它们。:)

于 2013-02-14T18:06:58.973 回答