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 文件中,并提供自定义 getter 函数

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

在您的 .m 文件中。

现在您可以通过属性访问数组:

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

当然,编译器不知道数组只有 60 个元素,所以如果你赋值,你不会得到编译器警告

mem.places[999] = 12;

一切不好的事情都可能发生。

将属性声明为read-only有意义,因为您无法更改 int 数组的地址。nonatomic(如果您不需要同步访问,您可能还想添加到属性属性,但这是一个不同的主题。)

于 2012-10-20T15:15:23.257 回答