こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Obj-C の@property

iOS4環境で効率重視でとにかくC言語の構造体のノリであらゆるメンバにアクセスする
コードを書いています。

struct AAA {
int a;
int b;
};

@interface Test {
AAA aaa;
}
@property (nonatmic) AAA aaa;
@end

でもって@synthesize aaa;をやると、Test のインスタンスを test
とすると
test.aaa

でもってアクセスできますが、肝心の
test.aaa.a や test.aaa.b はコンパイル、実行時に何のエラーも
出ない変わりに、一切値が変わらず、参照しても0です。
エラーならエラーではじいてくれれば分かるのですが、
なぜか0を返すので、何かの宣言が違うのか、悩んでしまいました。
もしこれが全く使用で使うことができないとしたら、
@public であらゆるメンバは公開としようかと思いましたが、
驚いた事にこれも全く予想どおりに機能しません。

やりたいことは、C言語の struct {...}のように、なんの
アクセス制限も無く、自由にメンバにさわりたい、ただそれだけの
事なのです。
よろしくお願いします。

投稿日時 - 2011-04-13 00:52:40

QNo.6664504

すぐに回答ほしいです

質問者が選んだベストアンサー

そうですねぇ、構造体でないといけませんか。Objective-Cなら普通はクラスを定義して使う感じですが……。とりあえず、以下のようにしてチェックしましたが、特に問題はなさそうです。クラスのプロパティに保管するならポインタでは。

typedef struct {
int a;
int b;
} AAA;

@interface Test : NSObject {
AAA *aaa;
}
@property () AAA *aaa;
@end


@implementation Test
@synthesize aaa;

@end


int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

Test *test = [[[Test alloc] init] autorelease];
AAA a = {100,200};
test.aaa = &a;
//test.aaa->a = 300; // とりあえずコメントアウト
//test.aaa->b = 400; // とりあえずコメントアウト
NSLog(@"a=%i,b=%i",test.aaa->a,test.aaa->b);

[pool drain];
return 0;
}

投稿日時 - 2011-04-13 09:12:04

お礼

ありがとうございます。
メモリの確保解放がいやらしくて(リークの元)、なるべく素の状態で構造体を
使いたいなぁと思っていました。どうせゲームだし、「きっちり書く」よりも「効率重視」です。

どうもありがとうございます。「簡単に」アクセッサでアクセスするのは難しいようですね。
教えていただいたやり方を参考に頑張ってみます。どうもありがとうございました。

投稿日時 - 2011-04-14 04:03:06

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

例示のコードは、じっさいプロジェクトに書いてコンパイルしようとすると、エラーが出るのですが……?
実践で書いているコードでなく、サンプルで示すためのコードだとしても、書き誤りのないようにしてもらわないと、検証のしようがありません。

投稿日時 - 2011-04-13 15:48:40

お礼

申し訳ありません。行き詰まってしまって、へろへろの
状態で書き込んでしまいました。多分 atomic のスペルが間違っていたかもしれません。
お手数おかけしてすいませんでした。以後書き込む際には気をつけたいと思います。

投稿日時 - 2011-04-14 03:58:35

あなたにオススメの質問