62

我在 Objective-C 中创建整数数组的属性时遇到了麻烦。我不确定这是否可以在 Obj-C 中做到,所以我希望有人能帮助我找出如何正确地做到这一点或提供替代解决方案。

我的班级.h

@interface myClass : NSObject {

@private int doubleDigits[10];
}

@property int doubleDigits;
@end

我的班级.m

@implementation myClass

    @synthesize doubleDigits;
    -(id) init {

        self = [super init];

        int doubleDigits[10] = {1,2,3,4,5,6,7,8,9,10};

        return self;
    }

    @end

当我构建并运行时,我收到以下错误:

错误:属性“doubleDigits”的类型与 ivar“doubleDigits”的类型不匹配

4

7 回答 7

30

这应该有效:

@interface MyClass
{
    int _doubleDigits[10]; 
}

@property(readonly) int *doubleDigits;

@end

@implementation MyClass

- (int *)doubleDigits
{
    return _doubleDigits;
}

@end
于 2009-01-25T01:38:47.420 回答
21

C 数组不是属性支持的数据类型之一。请参阅 Xcode 文档中“声明的属性”页面中的“Objective-C 编程语言”:

支持的类型

您可以为任何 Objective-C 类、Core Foundation 数据类型或“普通旧数据”(POD)类型声明属性(请参阅 C++ 语言说明:POD 类型)。但是,有关使用 Core Foundation 类型的限制,请参阅“Core Foundation”。</p>

POD 不包括 C 数组。见 http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html

如果你需要一个数组,你应该使用 NSArray 或 NSData。

在我看来,解决方法就像使用 (void *) 来规避类型检查。你可以这样做,但它会降低你的代码的可维护性。

于 2009-12-30T23:15:20.457 回答
16

就像 lucius 说的,不可能有一个 C 数组属性。使用 anNSArray是要走的路。数组只存储对象,所以你必须使用NSNumbers 来存储你的整数。使用新的文字语法,初始化它非常简单直接:

NSArray *doubleDigits = @[ @1, @2, @3, @4, @5, @6, @7, @8, @9, @10 ];

或者:

NSMutableArray *doubleDigits = [NSMutableArray array];

for (int n = 1; n <= 10; n++)
    [doubleDigits addObject:@(n)];

更多信息:NSArray 类参考NSNumber 类参考文字语法

于 2012-10-12T19:10:04.053 回答
12

我只是推测:

我认为 ivars 中定义的变量在对象中分配空间。这可以防止您创建访问器,因为您不能按值将数组提供给函数,而只能通过指针。因此,您必须在 ivars 中使用指针:

int *doubleDigits;

然后在 init-method 中为其分配空间:

@synthesize doubleDigits;

- (id)init {
    if (self = [super init]) {
        doubleDigits = malloc(sizeof(int) * 10);
        /*
         * This works, but is dangerous (forbidden) because bufferDoubleDigits
         * gets deleted at the end of -(id)init because it's on the stack:
         * int bufferDoubleDigits[] = {1,2,3,4,5,6,7,8,9,10};
         * [self setDoubleDigits:bufferDoubleDigits];
         *
         * If you want to be on the safe side use memcpy() (needs #include <string.h>)
         * doubleDigits = malloc(sizeof(int) * 10);
         * int bufferDoubleDigits[] = {1,2,3,4,5,6,7,8,9,10};
         * memcpy(doubleDigits, bufferDoubleDigits, sizeof(int) * 10);
         */
    }
    return self;
}

- (void)dealloc {
    free(doubleDigits);
    [super dealloc];
}

在这种情况下,界面如下所示:

@interface MyClass : NSObject {
    int *doubleDigits;
}
@property int *doubleDigits;

编辑:

我真的不确定是否允许这样做,这些值真的在堆栈上还是存储在其他地方?它们可能存储在堆栈中,因此在这种情况下使用不安全。(请参阅关于初始化列表的问题)

int bufferDoubleDigits[] = {1,2,3,4,5,6,7,8,9,10};
[self setDoubleDigits:bufferDoubleDigits];
于 2009-01-24T23:05:16.917 回答
6

这有效

@interface RGBComponents : NSObject {

    float components[8];

}

@property(readonly) float * components;

- (float *) components {
    return components;
}
于 2009-12-29T09:47:54.840 回答
1

您可以将它放在您的类的 .h 文件中,并将其定义为属性,在 XCode 7 中:

@property int  (*stuffILike) [10];
于 2016-04-07T18:02:54.840 回答
0

我发现所有以前的答案都太复杂了。我需要将一些整数数组存储为属性,并发现使用 NSArray 的 ObjC 要求是我的软件不必要的复杂性。

所以我用了这个:

typedef struct my10ints {
    int arr[10];
} my10ints;

@interface myClasss : NSObject

@property my10ints doubleDigits;

@end

这使用 Xcode 6.2 干净地编译。

我的意图像这样使用它:

myClass obj;
obj.doubleDigits.arr[0] = 4;

但是,这不起作用。这是它产生的:

int i = 4;
myClass obj;
obj.doubleDigits.arr[0] = i;
i = obj.doubleDigits.arr[0];
// i is now 0 !!!

正确使用它的唯一方法是:

int i = 4;
myClass obj;
my10ints ints;
ints = obj.doubleDigits;
ints.arr[0] = i;
obj.doubleDigits = ints;
i = obj.doubleDigits.arr[0];
// i is now 4

因此,完全违背了我的观点(避免使用 NSArray 的复杂性)。

于 2016-03-02T13:16:29.217 回答