我需要为自定义结构类型的 C 数组声明一个属性。
就属性声明而言,有人可以解释我应该用这个 C 数组做什么吗?我根本不应该使用财产声明吗?
我尝试memset()
了数组中的内存,但由于编译错误而惨遭失败。有人也可以解释一下吗?
我需要为自定义结构类型的 C 数组声明一个属性。
就属性声明而言,有人可以解释我应该用这个 C 数组做什么吗?我根本不应该使用财产声明吗?
我尝试memset()
了数组中的内存,但由于编译错误而惨遭失败。有人也可以解释一下吗?
这个答案并不能真正解决您的问题,它只是解释了为什么您的方法不起作用。
在 C 中,您不能从函数返回数组类型。这只是语言的限制(我不知道是有意还是无意)。通过扩展,在 Objective-C 中,您不能从方法中返回数组类型。这也意味着您不能将数组类型用作属性,因为编译器无法使用synthesize
返回数组类型的方法。
C 数组在表达式中使用时会自动转换为指针类型,因此您可以遵循@Graham 的建议并改用指针。这种方法的缺点是您必须确切地知道数组中有多少元素,这样您就不会意外地读到它的末尾。如果元素的数量是固定的并且在编译时已知,这可能是要走的路(如果你想避免NSArray
出于任何原因)。
很难回答为什么memset
在没有实际使用它的情况下无法编译,但一般来说这是可以使用的:
MyStruct someStructs[10];
memset(someStructs, 0, sizeof someStructs);
或者,可以从函数/方法返回结构,即使它们包含数组。从理论上讲,您可以创建一个包含数组的结构MyStruct
并将这个新的结构类型用作属性类型。实际上,这不是一个好主意,因为它只会增加一层复杂性。
如果你有这个:
@interface MyClass
{
struct MyStruct foo[5];
}
@end
你根本没有读/写属性。您可以声明一个只读属性
@property (readonly, assign) struct MyStruct* fooProperty;
这会给你一个指向数组的指针。但是,这可能很糟糕,因为它使您的其余代码可以在内部访问 MyClass 的结构。实现KVC indexed accessors可能会更好,您必须手动完成。
您当然可以将数组视为属性,它将具有“分配”行为,因为您不能保留结构。本质上,您仍然完全负责数组的内存分配。
您的另一个选择是用一个对象替换您的结构。然后它更自然地与属性机制一起工作,并向您开放了像 NSArray 这样的 Foundation 集合类。