如何模拟在Objective-C保护的属性和方法[复制](How to simulate prote

2019-08-03 08:00发布

可能重复:
在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声明

当然,我可以使用普通的类别,而不是扩展,但是这意味着我不能有保护性质。

所以我该怎么做?

Answer 1:

在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.hBGGoogleMap+protected.h头,但不出货BGGoogleMap_protectedInstanceVariables.h头。



Answer 2:

我希望我能告诉你,否则,但你就是不能。 更多信息请参见这个问题: 在Objective-C保护方法 。



Answer 3:

我不知道,你想做什么? 东西黑客或数据抽象出开裂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]