Objective-C 是否禁止使用结构?
Does Objective-C forbid use of structs?
我是 Objective C
的新手
我尝试使用一个简单的 struct
并得到
arc forbids objective-c objects in struct
Looking up ARC,看起来这是定义 Objective C 语法的规范 - 对吗?
其次,如果 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;
};
}
arc forbids objective-c objects in struct
结构是一种 C 结构。编译器以非常明确的方式告诉您,您不能在结构中包含 Objective-C 对象,而不是说结构是非法的。
您可以随心所欲地使用常规 C 结构。
您的示例试图将对 Objective-C 对象 NSString
的引用放入与 ARC 不兼容的 struct
中。
结构通常用于简单的数据结构。您可能在 Objective-C 代码中遇到的示例是 CGPoint
和 CGRect
。
CGPoint
看起来像这样
struct CGPoint
{
CGFloat x;
CGFloat y;
};
我认为 A CGFloat
只是一个 double
,它代表 2D 中的一个点 space。结构可以包括指向其他结构、C 数组和标准 C 数据类型的指针,例如 int
、char
、float
... 并且 Objective-C 类 可以包含结构,但反过来不起作用。
结构也可能变得相当复杂,但这是一个非常广泛的主题,最好使用 Google 进行研究。
在任何情况下,您都可以在 Objective-C++ 中使用 struct
和 ARC。
#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++ 结构与 ARC 兼容。
$ clang++ -x objective-c++ -fobjc-arc a.m -framework Foundation
$ ./a.out
San Francisco
如果你想在 Objective C(使用 ARC)中使用结构,请使用“__unsafe_unretained”属性。
struct Address {
__unsafe_unretained NSString *city;
__unsafe_unretained NSString *state;
__unsafe_unretained NSString *locality;
};
我是 Objective C
的新手我尝试使用一个简单的 struct
并得到
arc forbids objective-c objects in struct
Looking up ARC,看起来这是定义 Objective C 语法的规范 - 对吗?
其次,如果 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;
};
}
arc forbids objective-c objects in struct
结构是一种 C 结构。编译器以非常明确的方式告诉您,您不能在结构中包含 Objective-C 对象,而不是说结构是非法的。
您可以随心所欲地使用常规 C 结构。
您的示例试图将对 Objective-C 对象 NSString
的引用放入与 ARC 不兼容的 struct
中。
结构通常用于简单的数据结构。您可能在 Objective-C 代码中遇到的示例是 CGPoint
和 CGRect
。
CGPoint
看起来像这样
struct CGPoint
{
CGFloat x;
CGFloat y;
};
我认为 A CGFloat
只是一个 double
,它代表 2D 中的一个点 space。结构可以包括指向其他结构、C 数组和标准 C 数据类型的指针,例如 int
、char
、float
... 并且 Objective-C 类 可以包含结构,但反过来不起作用。
结构也可能变得相当复杂,但这是一个非常广泛的主题,最好使用 Google 进行研究。
在任何情况下,您都可以在 Objective-C++ 中使用 struct
和 ARC。
#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++ 结构与 ARC 兼容。
$ clang++ -x objective-c++ -fobjc-arc a.m -framework Foundation
$ ./a.out
San Francisco
如果你想在 Objective C(使用 ARC)中使用结构,请使用“__unsafe_unretained”属性。
struct Address {
__unsafe_unretained NSString *city;
__unsafe_unretained NSString *state;
__unsafe_unretained NSString *locality;
};