use*_*003 7 struct objective-c automatic-ref-counting
我是Objective C的新手
我试过用一个简单struct而且得到了
arc forbids objective-c objects in struct
Run Code Online (Sandbox Code Playgroud)
查看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;
};
}
Run Code Online (Sandbox Code Playgroud)
dan*_*n78 16
arc禁止struct中的objective-c对象
结构是C构造.编译器用非常不明确的术语告诉你,你不能在结构体中包含Objective-C对象,而不是结构体是非法的.
你可以使用你想要的常规C结构.
您的示例尝试将对Objective-C对象的引用NSString放入a struct,这与ARC不兼容.
结构通常用于简单的数据结构.您可能在Objective-C代码中遇到的示例是CGPoint和CGRect.
CGPoint 看起来像这样
struct CGPoint
{
CGFloat x;
CGFloat y;
};
Run Code Online (Sandbox Code Playgroud)
A CGFloat,我认为,只是一个double,它的意思是它代表2D空间中的一个点.结构可以包含指向其他结构,C-阵列和标准C数据类型,例如int,char,float...和Objective-C类可以包含结构,但反过来不行.
结构也可能变得相当复杂,但这是一个非常广泛的主题,最好使用谷歌进行研究.
Kaz*_*oto 13
在任何情况下,您都可以struct在Objective-C++中使用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;
}
Run Code Online (Sandbox Code Playgroud)
如果你把它编译为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.
Run Code Online (Sandbox Code Playgroud)
因为C struct没有管理可变寿命的能力.
但是在C++中,struct确实有析构函数.所以C++ struct与ARC兼容.
$ clang++ -x objective-c++ -fobjc-arc a.m -framework Foundation
$ ./a.out
San Francisco
Run Code Online (Sandbox Code Playgroud)
如果要在目标C(与ARC)中使用结构,请使用“ __unsafe_unretained”属性。
struct Address {
__unsafe_unretained NSString *city;
__unsafe_unretained NSString *state;
__unsafe_unretained NSString *locality;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19479 次 |
| 最近记录: |