当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在ObjectiveC中创建一个整数属性数组》经验,为你挑选了5个好方法。

我在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'的类型不匹配

希望有人可以提供解决方案或引导我朝正确的方向前进.

提前致谢.



1> robottobor..:

这应该工作:

@interface MyClass
{
    int _doubleDigits[10]; 
}

@property(readonly) int *doubleDigits;

@end

@implementation MyClass

- (int *)doubleDigits
{
    return _doubleDigits;
}

@end


只是为了补充一点,人们可能还想分配给变量.在这种情况下,使用`@property(assign)`和:` - (void)setDoubleDigits:(int*)doubleDigits {memcpy(_doubleDigits,doubleDigits,10*sizeof(int)); }`
请大小`sizeof(_doubleDigits)`,而不是`10*sizeof(int)`.:(

2> lucius..:

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*)来规避类型检查一样.您可以这样做,但它会使您的代码不易维护.


引用您的链接:"术语POD类型统称为以下C++类型类别,并包含这些类型的cv限定版本以及**这些**的数组[§3.9,10;§9, 4]:**标量类型**,[...]".

3> Tim Vermeule..:

就像lucius说的那样,不可能拥有C数组属性.使用a NSArray是要走的路.数组只存储对象,因此您必须使用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类参考,文字语法



4> Georg Schöll..:

我只是猜测:

我认为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];



5> 小智..:

这有效

@interface RGBComponents : NSObject {

    float components[8];

}

@property(readonly) float * components;

- (float *) components {
    return components;
}

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有