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;
};
}
アーク禁止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配列、およびint
、char
、float
...などの標準Cデータ型へのポインターを含めることができ、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構造体には、可変寿命を管理する機能がないためです。
しかし、C++では、structにはデストラクタ関数があります。したがって、C++構造体はARCと互換性があります。
$ clang++ -x objective-c++ -fobjc-arc a.m -framework Foundation
$ ./a.out
San Francisco
Objective C(ARCを使用)でstructを使用する場合は、「__ unsafe_unretained」属性を使用します。
struct Address {
__unsafe_unretained NSString *city;
__unsafe_unretained NSString *state;
__unsafe_unretained NSString *locality;
};