Objective c 目标C:使用目标C类别公开私有财产

Objective c 目标C:使用目标C类别公开私有财产,objective-c,objective-c-category,Objective C,Objective C Category,我正在寻找一种方法,使类扩展名内的.m文件中声明的私有属性成为公共的,这样就可以在类之外访问它,而不必更改其原始类 有没有办法做到这一点,可能是通过Objective-C类别 我从苹果的文档中看到,虽然不推荐使用category来重新定义原始类中已有的方法,但我不确定它是否可以用于使现有属性对其他类可用。通过使用category来显示方法,这确实是可能的 @interface MyClass (Private) @property (nonatomic, strong) NSObject *p

我正在寻找一种方法,使类扩展名内的.m文件中声明的私有属性成为公共的,这样就可以在类之外访问它,而不必更改其原始类

有没有办法做到这一点,可能是通过Objective-C类别


我从苹果的文档中看到,虽然不推荐使用category来重新定义原始类中已有的方法,但我不确定它是否可以用于使现有属性对其他类可用。

通过使用category来显示方法,这确实是可能的

@interface MyClass (Private)

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

@end

这就是所需要的,只要把它放在调用类可以看到的地方,这样就可以使用私有方法/属性。

是的,这是可能的,并且是公开这些属性进行测试的常见技巧

例如,你在你的Animal.m文件中有这个

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
@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