8

假设我有 2 个类:Money 和 Dollar,其中 Dollar 继承自 Money。

Money 在类扩展中声明了一个属性:

#import "Money.h"

@interface Money ()
@property(nonatomic) NSUInteger amount;
@end

@implementation Money

@end

Dollar 继承了这个属性,但它在 Dollar 中的方法中是不可见的。我可以通过在 Dollar.m 中重新声明属性来“修复”:

@interface Dollar ()
@property(nonatomic) NSUInteger amount;
@end
@implementation Dollar


}
@end

我真的不喜欢这个,我什至不确定我是否知道编译器在做什么:

  1. 它只是使财产可见吗?
  2. 它是否创建了一个新属性和新 iVar 并“遮蔽”了前一个?

除了类及其子类的实现之外,对所有人隐藏属性的最佳方法是什么?

理想情况下,我不希望在 .h 文件中可见,因为它是一个实现细节。

4

1 回答 1

10

在回答第一个问题时,可能是第一个选项。Money它只是在编译时将所有内容混合在一起。编译器和预编译器很聪明。

您可以使用私有标头来完成您正在尝试做的事情

公共文件Money.h

//Money.h 
@interface Money : NSObject
//public decl 
@end

子类Money-Private.h私有头文件

//Money-Private.h
@interface Money ()
@property(nonatomic) NSUInteger amount;
@end

由实现Money和任何子类或类别使用,例如

美元Dollar.h公众形象

#import "Money.h"
@interface Dollar:Money
@end

和实现Dollar.m

#import "Money-Private.h"
@implementation Dollar

-(void)foo
{
    self.amount = 75;
}

@end

如果您曾经选择创建一个公共框架,那么请确保只有公共标头被复制到包中。

于 2013-06-19T13:45:59.033 回答