Objective-C: Сделать частную собственность общедоступной с категорией Objective-C

Я ищу способ сделать частное свойство (объявленное в файле .m в расширении класса) общедоступным, чтобы оно было доступно вне класса, без изменения исходного класса.

Есть ли способ сделать это, возможно, через категорию Objective-C?

Из документации Apple я вижу, что эту категорию можно использовать, хотя и не рекомендуется, для переопределения методов, уже находящихся в исходном классе, но я не уверен, что ее можно использовать, чтобы сделать «существующие» свойства доступными для других классов.


person Sunwoo Park    schedule 13.06.2014    source источник


Ответы (2)


Это действительно возможно, если использовать категорию для отображения метода.

@interface MyClass (Private)

@property (nonatomic, strong) NSObject *privatePropertyToExpose;
- (void) privateMethodIWantToUse;

@end

Это все, что нужно, просто вставьте это где-нибудь, где ваш вызывающий класс может его увидеть, и это позволит вам использовать частный метод/свойство.

person Dima    schedule 13.06.2014

Да, это возможно, и это обычная уловка для проверки этого свойства.

Так, например, у вас есть это в вашем файле Animal.m

@interface FTGAnimal ()

@property (nonatomic, strong) FTGFood *food;

@end

@implementation FTGAnimal

@end

В вашем FTGAnimalTests.m вы можете сделать так:

@interface FTGAnimal (FTGAnimalTests)

@property (nonatomic, strong) FTGFood *food;

@end

SPEC_BEGIN(FTGAnimalTests)

describe(@"FTGAnimalTests", ^{
    context(@"default context", ^{
        it(@"should initialize correct animal", ^{
            FTGAnimal *animal = [[FTGAnimal alloc] init];

            [[animal.food should] beMemberOfClass:[FTGFood class]];

        });
    });
});

SPEC_END
person onmyway133    schedule 13.06.2014