可能重复:
Protected methods in objective-c
声明私有属性的方法很简单。
您声明在.m文件中声明的扩展名中。
假设我想声明受保护的属性并从类和子类访问它。
我就是这么想的:

//
//  BGGoogleMap+protected.h
//
//

#import "BGGoogleMap.h"

@interface BGGoogleMap ()
@property (strong,nonatomic) NSString * protectedHello;
@end

那个是编译的。然后我补充道:
#import "BGGoogleMap+protected.h"

@implementation BGGoogleMap ()

-(NSString *) protectedHello
{
    return _
}

@end

问题开始了。我不能在它的原始.m文件之外实现类扩展。xcode将要求该括号内的内容。
如果我做了
#import "BGGoogleMap+protected.h"

@implementation BGGoogleMap (protected)

-(NSString *) protectedHello
{
    return _
}

@end

我不能访问在BGoGoMeLAMP+Health.h中声明的PyExeCdTeHelp的IVAR。
当然,我可以使用常规类别而不是扩展,但这意味着我不能有受保护的属性。
那我该怎么办?

最佳答案

The Objective-C Programming Language说:
类扩展类似于匿名类别,只是声明的方法必须在相应的类的主@implementation块中实现。
所以您可以在类的main@implementation中实现类扩展的方法。这是最简单的解决办法。
一个更复杂的解决方案是声明一个类别中的“受保护”消息和属性,并在类扩展中声明该类的任何实例变量。分类如下:
BGGoogleMap+protected.h

#import "BGGoogleMap.h"

@interface BGGoogleMap (protected)

@property (nonatomic) NSString * protectedHello;

@end

由于类别无法添加实例变量来保存protectedHello,我们还需要一个类扩展:
` bggooglemap_protectedinstancevariables.h'
#import "BGGoogleMap.h"

@interface BGGoogleMap () {
    NSString *_protectedHello;
}
@end

我们需要在主@implementation文件中包含类扩展名,以便编译器在.o文件中发出实例变量:
BGGoogleMap.m
#import "BGGoogleMap.h"
#import "BGGoogleMap_protectedInstanceVariables.h"

@implementation BGGoogleMap

...

我们需要在category@implementation文件中包含类扩展名,以便category方法可以访问实例变量。由于我们声明了一个类别中的protectedHello属性,编译器将不会合成SETER和GETTER方法。我们必须手写:
BGGoogleMap+protected.m
#import "BGGoogleMap+protected.h"

@implementation BGGoogleMap (protected)

- (void)setProtectedHello:(NSString *)newValue {
    _protectedHello = newValue; // assuming ARC
}

- (NSString *)protectedHello {
    return _protectedHello;
}

@end

子类应该导入BGGoogleMap+protected.h才能使用protectedHello属性。它们不应该导入BGGoogleMap_protectedInstanceVariables.h,因为实例变量应该被视为基类的私有变量。如果您在没有源代码的情况下发布静态库,并且希望库的用户能够将子类归类为ccc>,则提交BGGoogleMapBGGoogleMap.h标头,但不要装运BGGoogleMap+protected.h报头。

关于objective-c - 如何在Objective-C中模拟 protected 属性和方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13637944/

10-09 08:09