我在Objective C中创建一个整数数组的属性时遇到了麻烦。 我不确定在Obj-C中是否甚至可以做到这一点所以我希望有人可以帮我找到如何正确地做到这一点或提供替代解决方案。
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
当我构建并运行时,我收到以下错误:
错误:属性类型'doubleDigits' 与伊塔尔的类型不匹配 'doubleDigits'
希望有人可以提供解决方案或引导我朝正确的方向发展。
提前致谢。
答案 0 :(得分:30)
这应该有效:
@interface MyClass
{
int _doubleDigits[10];
}
@property(readonly) int *doubleDigits;
@end
@implementation MyClass
- (int *)doubleDigits
{
return _doubleDigits;
}
@end
答案 1 :(得分:20)
C数组不是属性支持的数据类型之一。请参阅Xcode文档中的“Objective-C编程语言”,在“声明的属性”页面中:
支持的类型
您可以为任何人声明属性 Objective-C类,核心基础 数据类型,或“普通旧数据”(POD) type(参见C ++语言注释:POD 类型)。有关使用Core的限制 然而,基础类型见“核心 基础。”
POD不包括C数组。看到 http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html
如果需要数组,则应使用NSArray或NSData。
我认为,变通方法就像使用(void *)来规避类型检查一样。您可以这样做,但它会使您的代码难以维护。
答案 2 :(得分:16)
就像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 Class Reference,NSNumber Class Reference,Literal Syntax
答案 3 :(得分: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;
修改强>
我真的不确定它是否允许这样做,这些值是真的在堆栈上还是存储在其他地方?它们可能存储在堆栈中,因此在此上下文中使用时不安全。 (见question on initializer lists)
int bufferDoubleDigits[] = {1,2,3,4,5,6,7,8,9,10};
[self setDoubleDigits:bufferDoubleDigits];
答案 4 :(得分:6)
这有效
@interface RGBComponents : NSObject {
float components[8];
}
@property(readonly) float * components;
- (float *) components {
return components;
}
答案 5 :(得分:1)
您可以将它放在您的班级的.h文件中,并在XCode 7中将其定义为属性:
@property int (*stuffILike) [10];
答案 6 :(得分:0)
我发现之前的所有答案都太复杂了。 我需要将一些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的复杂性)。