我有这个:
typedef struct objTag{
float x;
float y;
BOOL isUP;
} object;
如何使对象成为这样的属性
@property (nonatomic, assign) object myObj;
接着...
@synthesize myObj = _myObj;
这编译得很好,但是稍后在我尝试类似的代码时
self.myObj.isUP = YES;
我收到消息“表达式不可分配”
我有这个:
typedef struct objTag{
float x;
float y;
BOOL isUP;
} object;
如何使对象成为这样的属性
@property (nonatomic, assign) object myObj;
接着...
@synthesize myObj = _myObj;
这编译得很好,但是稍后在我尝试类似的代码时
self.myObj.isUP = YES;
我收到消息“表达式不可分配”
这不起作用,因为编译器会将其编译为:
[[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 。
这个问题回到了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.
这就像处理 UIViews 上的帧一样 - 您需要一次性分配整个结构,而不是它的子值。所以像:
object obj = self.myObj;
obj.isUP = YES;
self.myObj = obj;
如果您不喜欢这样(这很糟糕!),请不要使用结构。而是构建一个具有几个属性的类。结构真的就在那里,因为 obj-c 是 c 的超集,如果可以的话,你应该避免它们。:)