Objective-C是否禁止使用结构?

时间:2015-02-12 07:38:21

标签: objective-c struct automatic-ref-counting

我是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;
    };
}

3 个答案:

答案 0 :(得分:12)

  

arc禁止在struct

中使用 objective-c对象

结构是C结构。编译器用非常不明确的术语告诉你,你不能在结构体中包含Objective-C对象,而不是结构体是非法的。

您可以使用常规C结构。

您的示例尝试将对Objective-C对象NSString的引用放入struct,这与ARC不兼容。

结构通常用于简单的数据结构。您可能在Objective-C代码中遇到的示例包括CGPointCGRect

CGPoint看起来像这样

struct CGPoint 
{ 
   CGFloat x; 
   CGFloat y; 
};

我认为CGFloat只是一个double,它的意思是它代表2D空间中的一个点。结构可以包括指向其他​​结构,C数组和标准C数据类型的指针,例如intcharfloat ......而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;
};