Objective C 2.0: class_copyPropertyList (), как перечислить свойства от категорий

Вы используете input() для запроса ввода от пользователя, затем назначаете ввод переменной и передаете эту переменную в функцию;

x = input()
19
задан ashcatch 11 May 2009 в 15:26
поделиться

1 ответ

На основе моих тестов здесь свойства из категорий будут отображаться при использовании class_copyPropertyList . Похоже, что свойства, которые вы видите в UIView, только описаны как свойства в общедоступных заголовках, а не объявлены как таковые при построении самого UIKit. Вероятно, они приняли синтаксис свойств, чтобы сделать создание общедоступных заголовков немного быстрее.

Для справки, вот мой тестовый проект:

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface TestClass : NSObject
{
    NSString * str1;
    NSString * str2;
}
@property (nonatomic, copy) NSString * str1;
@end

@interface TestClass (TestCategory)
@property (nonatomic, copy) NSString * str2;
@end

@implementation TestClass
@synthesize str1;
@end

@implementation TestClass (TestCategory)

// have to actually *implement* these functions, can't use @synthesize for category-based properties
- (NSString *) str2
{
    return ( str2 );
}

- (void) setStr2: (NSString *) newStr
{
    [str2 release];
    str2 = [newStr copy];
}

@end

int main (int argc, const char * argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList([TestClass class], &outCount);
    for (i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        fprintf(stdout, "%s %s\n", property_getName(property), property_getAttributes(property));
    }

    [pool drain];
    return 0;
}

И вот результат:

str2 T@"NSString",C
str1 T@"NSString",C,Vstr1
14
ответ дан 30 November 2019 в 04:44
поделиться