0

次のコードを使用してc配列を定義しています(警告以外はうまく機能します):

.hファイル:

@interface memory : NSObject 
{
     int places[60];
     int lastRecordSound;  
}

@property int *places;

それから私の中で私.mはそれを同期していません(そしてそれは動作します)が、私がそれを同期しようとすると:

@synthesize places;

エラーが発生します:

type of preperty "places does not match type of ivar places (int[60] )

そうでない場合は、警告が表示されます:

auto synthesized property places will be use synthesized instance variable _places...

では、このc配列を定義する最良の方法は何ですか?(はい、cが必要です..)

4

3 に答える 3

0

それ以外の

@場所を同期します。

あなたは書く必要があります

@synthesizeの場所;

また、iVarをからに変更int places[60];するint *places;か、これらの行を完全に削除することもできます。

于 2012-10-20T11:01:18.057 に答える
0

これ?(非ARC)

#import <Foundation/Foundation.h>

@interface Memory:NSObject
@property int *places;
@end

@implementation Memory
@synthesize places;
@end

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

    int *p;
    if( p = malloc(60 * sizeof(int)) ) {
        p[1] = 99;
        Memory *aMemory = [[Memory alloc] init];
        aMemory.places = p;

        int *q = aMemory.places;
        printf("q[1] = %d\n",q[1]);

        free(p);
        [aMemory release];
    }
    else {
        printf("ERROR: unable to malloc p\n");
    }

    [pool release];
}

コンソールq[1] = 99に出力します。

于 2012-10-20T11:20:13.917 に答える
0

int *自動生成されたアクセサー関数は、プロパティをint[]配列に関連付けることができません。ただし、プロパティを次のように宣言すると機能します

@property(readonly) int *places;

.h ファイルで、カスタム ゲッター関数を提供します。

- (int *)places
{
    return self->places;
}

あなたの.mファイルで。

これで、プロパティを介して配列にアクセスできます。

memory *mem = [[memory alloc] init];
mem.places[23] = 12;

もちろん、コンパイラは配列に 60 個の要素しかないことを認識していないため、代入してもコンパイラの警告は表示されません。

mem.places[999] = 12;

悪いことはすべて起こりえます。

int 配列のアドレスを変更できないため、プロパティを として宣言するread-onlyことは理にかなっています。nonatomic(同期アクセスが必要ない場合は、プロパティ属性に追加することもできますが、それは別のトピックです。)

于 2012-10-20T15:15:23.257 に答える