アプリ版:「スタンプのみでお礼する」機能のリリースについて

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 {...}のように、なんの
アクセス制限も無く、自由にメンバにさわりたい、ただそれだけの
事なのです。
よろしくお願いします。

A 回答 (2件)

そうですねぇ、構造体でないといけませんか。

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;
}
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2011/04/14 04:03

例示のコードは、じっさいプロジェクトに書いてコンパイルしようとすると、エラーが出るのですが……?


実践で書いているコードでなく、サンプルで示すためのコードだとしても、書き誤りのないようにしてもらわないと、検証のしようがありません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/04/14 03:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!