在Objective C中创build一个整数属性数组

我在创build一个在Objective C中的整数数组属性的麻烦。我不知道这是甚至可以在Obj-C做,所以我希望有人可以帮助我找出如何做到这一点正确或提供替代解决scheme。

myclass.h

@interface myClass : NSObject { @private int doubleDigits[10]; } @property int doubleDigits; @end 

myclass.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 

当我build立并运行时,我得到以下错误:

错误:属性types'doubleDigits'不匹配types的伊娃'doubleDigits'

希望有人能提供一个解决scheme或引导我在正确的方向。

提前致谢。

这应该工作:

 @interface MyClass { int _doubleDigits[10]; } @property(readonly) int *doubleDigits; @end @implementation MyClass - (int *)doubleDigits { return _doubleDigits; } @end 

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

支持的types

您可以为任何Objective-C类,Core Foundation数据types或“普通旧数据”(POD)types声明一个属性(请参阅C ++语言注释:PODtypes)。 有关使用Core Foundationtypes的限制,请参阅“Core Foundation”。

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

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

正如我所看到的,解决方法就像使用(void *)来规避types检查。 你可以做到这一点,但它使得你的代码不易维护。

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

 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类参考 , 文字句法

我只是猜测:

我认为在ivars中定义的variables在对象中分配空间。 这可以防止你创build访问器,因为你不能通过值给一个数组,而只能通过一个指针。 因此你必须在ivars中使用一个指针:

 int *doubleDigits; 

然后在init方法中为它分配空间:

 @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]; 

这工作

 @interface RGBComponents : NSObject { float components[8]; } @property(readonly) float * components; 

 - (float *) components { return components; } 

我发现所有以前的答案太复杂了。 我有需要存储一些int作为一个属性的数组,并发现使用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的复杂性)。

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

 @property int (*stuffILike) [10];