web-dev-qa-db-ja.com

Objective-Cは構造体の使用を禁止していますか?

Objective Cは初めてです

シンプルなstructを使ってみたところ、

arc forbids objective-c objects in struct

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;
    };
}
11
user2490003

アーク禁止objective-c objects in struct

構造体はCの構造体です。コンパイラーは、非常に曖昧な言葉で、構造体の中にObjective-Cオブジェクトを含めることはできず、構造体が違法であることを伝えています。

通常のC構造体をすべて使用できます。

あなたの例は、Objective-CオブジェクトNSStringへの参照をARCと互換性のないstructに入れようとしています。

構造体は通常、単純なデータ構造に使用されます。 Objective-Cコードで遭遇する可能性が高い例は、CGPointおよびCGRectです。

CGPointは次のようになります

struct CGPoint 
{ 
   CGFloat x; 
   CGFloat y; 
};

CGFloatは、単なるdoubleであり、2D空間の点を表すという考えです。構造体には、他の構造体、C配列、およびintcharfloat...などの標準Cデータ型へのポインターを含めることができ、Objective-Cクラスには構造体を含めることができます。しかし、逆は機能しません。

構造体もかなり複雑になる可能性がありますが、これは非常に広範なトピックであり、Googleを使用して研究するのが最適です。

16
dandan78

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構造体には、可変寿命を管理する機能がないためです。

しかし、C++では、structにはデストラクタ関数があります。したがって、C++構造体はARCと互換性があります。

$ clang++ -x objective-c++ -fobjc-arc a.m -framework Foundation
$ ./a.out
San Francisco
13
Kazuki Sakamoto

Objective C(ARCを使用)でstructを使用する場合は、「__ unsafe_unretained」属性を使用します。

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