代码之家  ›  专栏  ›  技术社区  ›  user2490003

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

  •  13
  • user2490003  · 技术社区  · 10 年前

    我是目标C的新手

    我试着用一个简单的 struct 并且得到

    arc forbids objective-c objects in struct
    

    Looking up ARC ,看起来这是定义Objective C语法的规范-正确吗?

    其次,我如何使用 结构 如果不允许的话?

    非常感谢。

    编辑:一些代码作为示例

    @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 回复  |  直到 10 年前
        1
  •  22
  •   rptwsthi    2 年前

    电弧禁止 objective-c对象 在结构中

    结构是C结构。编译器非常明确地告诉你,结构中不能有Objective-C对象,而不是结构是非法的。

    您可以任意使用常规C结构。

    您的示例试图引用Objective-C对象, NSString ,转换为 struct ,与ARC不兼容。

    结构通常用于简单的数据结构。您可能在Objective-C代码中遇到的示例有 CGPoint CGRect .

    CGPoint公司 看起来像这样

    struct CGPoint 
    { 
       CGFloat x; 
       CGFloat y; 
    };
    

    A. CGFloat 我想,只是 double ,其思想是表示2D空间中的点。结构可以包括指向其他结构、C数组和标准C数据类型的指针,例如 int , char , float …并且Objective-C类可以包含结构,但反过来不行。

    结构也可能变得非常复杂,但这是一个非常广泛的主题,最好使用谷歌进行研究。

        2
  •  14
  •   Kazuki Sakamoto    10 年前

    您可以使用 struct 在里面 目标-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;
    }
    

    如果你把它编译成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结构不具备可变寿命的管理能力。

    但在C++中,结构确实有析构函数。因此C++结构与ARC兼容。

    $ clang++ -x objective-c++ -fobjc-arc a.m -framework Foundation
    $ ./a.out
    San Francisco
    
        3
  •  8
  •   Soumen Thiago Arreguy    7 年前

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

    struct Address {
       __unsafe_unretained NSString *city;
       __unsafe_unretained NSString *state;
       __unsafe_unretained NSString *locality;
    };