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'は、Obj-CオブジェクトivarではなくC構造体のプロパティであることに注意してください。

編集:

本当に直接操作が必要な場合は、このようにする必要があります。

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

これは、UIViewでフレームを処理するのと同じです。構造体全体を、そのサブ値ではなく、一度に割り当てる必要があります。だから次のようなもの:

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

それが気に入らない場合(それはひどいです!)、構造体を使用しないでください。代わりに、いくつかのプロパティを持つクラスを作成します。obj-cはcのスーパーセットであるため、構造体は実際にはそこにあります。可能であれば、構造体を避ける必要があります。:)

于 2013-02-14T18:06:58.973 に答える