我在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'与ivar'doubleDigits'的类型不匹配
希望有人可以提供解决方案或引导我朝正确的方向前进.
提前致谢.
这应该工作:
@interface MyClass { int _doubleDigits[10]; } @property(readonly) int *doubleDigits; @end @implementation MyClass - (int *)doubleDigits { return _doubleDigits; } @end
C数组不是属性支持的数据类型之一.请参阅声明属性页面中的Xcode文档中的"Objective-C编程语言":
支持的类型
您可以为任何Objective-C类,Core Foundation数据类型或"普通旧数据"(POD)类型声明属性(请参阅C++语言注释:POD类型).但是,有关使用Core Foundation类型的限制,请参阅"Core Foundation".
POD不包括C数组.见 http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html
如果需要数组,则应使用NSArray或NSData.
我认为,解决方法就像使用(void*)来规避类型检查一样.您可以这样做,但它会使您的代码不易维护.
就像lucius说的那样,不可能拥有C数组属性.使用a NSArray
是要走的路.数组只存储对象,因此您必须使用NSNumber
s来存储您的整数.使用新的文字语法,初始化它非常简单直接:
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中定义的变量会在对象中分配空间.这可以防止您创建访问器,因为您不能通过值向数组提供数组,而只能通过指针.因此,您必须在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) * 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; }