2010-10-25 81 views
1

我需要为自定义结构类型的C数组声明一个属性。使用C数组作为属性

有人可以解释我应该怎么做这个C数组至于属性声明?我应该不使用财产声明吗?

我试着memset()在阵列中的内存,并失败与编译错误悲惨。有人可以解释一下吗?

回答

2

这个答案并不能真正解决你的问题,它只是解释了为什么你的方法不起作用。

在C中,你不能从函数返回数组类型。这只是语言的限制(有意或无意我不知道)。通过扩展,在Objective-C中,您不能从方法返回数组类型。这也意味着你不能使用数组类型作为属性,因为编译器无法返回一个数组类型的方法。

当在表达式中使用时,C数组会自动转换为指针类型,所以您可以遵循@ Graham的建议并使用指针。这种方法的缺点是,您必须确切知道阵列中有多少个元素,以便您不会意外地读过它的末尾。如果元素的数量在编译时是固定的和已知的,那么这可能是要走的路(如果你想避免NSArray出于任何原因)。

这是很难回答为什么memset失败,没有真正看到你如何使用它,但一般来说这种编译是如何使用:

MyStruct someStructs[10]; 

memset(someStructs, 0, sizeof someStructs); 

另外,也可以从函数返回结构/方法,即使它们包含数组。从理论上讲,你可以创建一个包含数组MyStruct的结构,并使用这个新的结构类型作为属性类型。实际上,这不是一个好主意,因为它只是增加了一层复杂性。

+0

您也可以读取/写入数组语法数组的末尾。以下是合法的,虽然破坏了,C: int x [2] = {0}; x [27] = 3; – 2010-10-25 09:49:41

0

你当然可以将数组视为一个属性,它将有“分配”行为,因为你不能保留一个结构。基本上,你仍然完全负责数组的内存分配。

你有的另一个选择是用一个对象替换你的结构。然后,它更自然地与物业机器合作,并为您打开像NSArray这样的基础集合课程。

+0

我对使用NSArray(这是我最初的方法)有点不确定。我只是想像C中一样简单地直接访问数组元素,但不确定是否可以简单地分配一个NSArray和访问元素16,例如,写入和读出它,或者如果有一些不同行为与它们相比,C阵列不允许这样做。回想起来,尽管如此,我想我应该已经认识到它的行为就像C数组一样,可以访问随机元素并设置/获取它们的值,而无需填充较低的索引元素。 – Joey 2010-10-25 07:25:01

+0

另外,我有一些问题试图将其设置为属性。如果我有MyStruct mList [5];作为我的成员var,我不能做@property(nonatomic,assign)MyStruct mList [5];因为我得到一个不良的属性声明编译错误。 – Joey 2010-10-25 07:29:36

+0

@Joey:我认为你需要将属性定义为'@property(nonatomic,assign)MyStruct * mList;'将它用作C数组。对于'NSArray',你必须先填入元素0-7,然后才能使用元素8.你可以使用对象'[NSNull null]'作为未设置值的占位符。 – 2010-10-25 07:41:00

1

如果你有这样的:

@interface MyClass 
{ 
    struct MyStruct foo[5]; 
} 
@end 

你不能有一个读/都写属性。你可以声明一个只读属性

@property (readonly, assign) struct MyStruct* fooProperty; 

它会给你一个指向数组的指针。但是,这可能是不好的,因为它会让您的代码的其余部分内部访问MyClass的结构。实施KVC indexed accessors会更好,您必须手动完成。