我是Objective C的新手
我尝试使用简单的struct
并获得了
arc forbids objective-c objects in struct
Looking up ARC,看起来这是定义Objective C syntaxt的规范 - 这是正确的吗?
其次,如果不允许,我该如何使用struct
?
谢谢!
编辑:某些代码作为示例
@implementation Cities {
// The goal is to have a struct that holds information about a city,
// like when a person started and ended living there.
// I was trying to make this struct an instance variable of the Cities
// class
// XCode doesn't like the below struct definition
struct City
{
NSString *name;
int *_startYear;
int *_endYear;
};
}
答案 0 :(得分:12)
arc禁止在struct
中使用 objective-c对象
结构是C结构。编译器用非常不明确的术语告诉你,你不能在结构体中包含Objective-C对象,而不是结构体是非法的。
您可以使用常规C结构。
您的示例尝试将对Objective-C对象NSString
的引用放入struct
,这与ARC不兼容。
结构通常用于简单的数据结构。您可能在Objective-C代码中遇到的示例包括CGPoint
和CGRect
。
CGPoint
看起来像这样
struct CGPoint
{
CGFloat x;
CGFloat y;
};
我认为CGFloat
只是一个double
,它的意思是它代表2D空间中的一个点。结构可以包括指向其他结构,C数组和标准C数据类型的指针,例如int
,char
,float
......而Objective-C类可以包含结构,但反之不起作用。
结构也可能变得相当复杂,但这是一个非常广泛的主题,最好使用谷歌进行研究。
答案 1 :(得分:11)
在任何情况下,您都可以在ARC中使用 Objective-C ++ 中的struct
。
#import <Foundation/Foundation.h>
@interface City : NSObject
struct Data {
NSString *name;
};
@property struct Data data;
@end
@implementation City
@end
int main()
{
City *city = [[City alloc] init];
city.data = (struct Data){@"San Francisco"};
NSLog(@"%@", city.data.name);
return 0;
}
如果你把它编译为Objective-C,你就失败了。
$ clang -x objective-c -fobjc-arc a.m -framework Foundation
a.m:5:15: error: ARC forbids Objective-C objects in struct
NSString *name;
^
1 error generated.
因为C struct不具备可变寿命管理的能力。
但是在C ++中,struct确实有析构函数。所以C ++ struct与ARC兼容。
$ clang++ -x objective-c++ -fobjc-arc a.m -framework Foundation
$ ./a.out
San Francisco
答案 2 :(得分:3)
如果你想在Objective C(使用ARC)中使用struct,请使用&#34; __ unsafe_unretained&#34;属性。
struct Address {
__unsafe_unretained NSString *city;
__unsafe_unretained NSString *state;
__unsafe_unretained NSString *locality;
};