可能重复:
在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
我无法访问_protectedHello的伊娃在BGGoogleMap + protected.h声明
当然,我可以使用普通的类别,而不是扩展,但是这意味着我不能有保护性质。
所以我该怎么做?
在Objective-C编程语言这样说:
类扩展是像匿名类,除了它们申报方法必须在主来实现@implementation
为相应的类块。
所以,你可以只实现你的类扩展的类中的主要方法@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
...
我们需要在该类别中的类扩展@implementation
文件,这样的分类方法可以访问实例变量。 自从我们宣布protectedHello
一个类别属性,编译器将不能合成的setter和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
因为实例变量应该为私有基类来处理。 如果船舶静态库没有源代码,并希望该库的用户能够子类BGGoogleMap
,船舶BGGoogleMap.h
和BGGoogleMap+protected.h
头,但不出货BGGoogleMap_protectedInstanceVariables.h
头。
我希望我能告诉你,否则,但你就是不能。 更多信息请参见这个问题: 在Objective-C保护方法 。
我不知道,你想做什么? 东西黑客或数据抽象出开裂OOPS概念?
扩展来添加属性。 您已成功将私有财产作为
#import "BGGoogleMap.h"
@interface BGGoogleMap ()
@property (strong,nonatomic) NSString * protectedHello;
@end
你在这干什么?
#import "BGGoogleMap+protected.h"
@implementation BGGoogleMap ()
-(NSString *) protectedHello
{
return _
}
@end
您已经扩展一个类,现在你又实施同一类! 两次!!! 和类别只配备了.h文件中。 我猜你正在创建自己.m文件,是不能接受的。
私有属性不能在类外部访问,它只能从基类或子类进行访问。 这是什么错误。
I can't implement class extension outside the original .m files it seems.
是的,这是一个抽象和Objective-C的数据隐藏!
文章来源: How to simulate protected properties and methods in objective-c [duplicate]