2

property_getAttributes()ランタイム関数を使用して、オブジェクトのプロパティ属性を取得しようとしています。一部のプロパティは読み取り専用に設定されています。しかし、retain/strong、weak、および assign プロパティを区別しようとすると、問題が発生します。例えば:

私たちが持っているとしましょう:

@interface MyObject : NSObject
@property (assign, readonly) NSObject *prop1;
@property (strong, readonly) NSObject *prop2;
@property (weak, readonly) NSObject *prop3;
@end

プロパティリストを取得して印刷します

int outCount;
objc_property_t *properties = class_copyPropertyList([MyObject class], &outCount);
for(i = 0; i < outCount; i++) {
    objc_property_t property = properties[i];
    const char *c_attributes = property_getAttributes(property);
    printf("%s", c_attributes);
}
free(properties);

結果は次のとおりです。

T@"NSObject",R,V_prop1
T@"NSObject",R,V_prop2
T@"NSObject",R,V_prop3

...したがって、弱い、強い/保持するための特定のコードはなく、読み取り専用の場合にプロパティを割り当てます:(

問題は、プロパティが弱い、強い/保持する、割り当てているかどうかを知る他の方法はありますか?

4

2 に答える 2

3

私はあなたのコードを試していませんが、によると

https://developer.apple.com/library/mac/documentation/cocoa/conceptual/objcruntimeguide/articles/ocrtpropertyintrospection.html

R プロパティは読み取り専用です (読み取り専用)

C プロパティは、最後に割り当てられた値のコピー (コピー) です。

& プロパティは、最後に割り当てられた値への参照です (保持)。

N プロパティは非アトミック (非アトミック) です。

G プロパティは、カスタム getter セレクター名を定義します。G の後に名前が続きます (例: GcustomGetter)。

S プロパティは、カスタム セッター セレクター名を定義します。S の後に名前が続きます (たとえば、ScustomSetter:,)。

D プロパティは動的 (@dynamic) です。

W プロパティは弱参照 (__weak) です。

P プロパティはガベージ コレクションの対象です。

t 古いスタイルのエンコーディングを使用して型を指定します。

于 2014-04-21T12:51:09.517 に答える