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 代码中遇到的示例是 CGPointCGRect

CGPoint 看起来像这样

struct CGPoint 
{ 
   CGFloat x; 
   CGFloat y; 
};
我认为

A CGFloat 只是一个 double,它代表 2D 中的一个点 space。结构可以包括指向其他​​结构、C 数组和标准 C 数据类型的指针,例如 intcharfloat... 并且 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;
};