可能重复:
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>,则提交BGGoogleMap
和BGGoogleMap.h
标头,但不要装运BGGoogleMap+protected.h
报头。关于objective-c - 如何在Objective-C中模拟 protected 属性和方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13637944/