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

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)


Sou*_*men 6

如果要在目标C(与ARC)中使用结构,请使用“ __unsafe_unretained”属性。

struct Address {
   __unsafe_unretained NSString *city;
   __unsafe_unretained NSString *state;
   __unsafe_unretained NSString *locality;
};
Run Code Online (Sandbox Code Playgroud)

  • 对于使用此功能的用户,请注意访问已释放的`__unsafe_unretained`变量将导致崩溃 (3认同)