1

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

就属性声明而言,有人可以解释我应该用这个 C 数组做什么吗?我根本不应该使用财产声明吗?

我尝试memset()了数组中的内存,但由于编译错误而惨遭失败。有人也可以解释一下吗?

4

3 回答 3

2

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

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

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

很难回答为什么memset在没有实际使用它的情况下无法编译,但一般来说这是可以使用的:

MyStruct someStructs[10];

memset(someStructs, 0, sizeof someStructs);

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

于 2010-10-25T08:19:25.017 回答
1

如果你有这个:

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

你根本没有读/写属性。您可以声明一个只读属性

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

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

于 2010-10-25T08:44:35.130 回答
0

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

您的另一个选择是用一个对象替换您的结构。然后它更自然地与属性机制一起工作,并向您开放了像 NSArray 这样的 Foundation 集合类。

于 2010-10-25T07:05:50.723 回答