Objective c 将属性声明为受保护的更好方法

Objective c 将属性声明为受保护的更好方法,objective-c,inheritance,properties,ivar,Objective C,Inheritance,Properties,Ivar,接下来,我看到了解决我所面临问题的方法 我的问题,就像他的问题一样,是我有一个类,它有一个必须在其子类中继承和访问的属性: @interface A : NSObject @property (nonatomic, readonly) NSUInteger prop; @end @implementation A // Don't need to synthesize nowadays @end @interface B : A // No new properties @e

接下来,我看到了解决我所面临问题的方法

我的问题,就像他的问题一样,是我有一个类,它有一个必须在其子类中继承和访问的属性:

@interface A : NSObject
@property (nonatomic, readonly) NSUInteger prop;
@end

@implementation A
    // Don't need to synthesize nowadays
@end

@interface B : A
    // No new properties
@end

@implementation B

- (void)establishValueForProp
{
    _prop = 1; // PROBLEM !!!
}

@end
解决办法是:

@interface A : NSObject {
    @protected
    NSUInteger _prop;
}
@property (nonatomic, readonly) NSUInteger prop;
@end

我想知道的是,是否还有其他方法可以将属性声明为受保护的?

我通常这样做的方法是创建第二个头,称为ClassName_ForSubclasses.h。在该头文件中,添加一个类扩展名,其中包含希望子类能够调用和重写的属性和方法。然后,子类可以导入该头,而类的其他用户看不到它。

我通常这样做的方式是创建第二个头,称为ClassName\u ForSubclasses.h。在该头文件中,添加一个类扩展名,其中包含希望子类能够调用和重写的属性和方法。然后,子类可以导入该头文件,而类的其他用户看不到它。

另一种常见的方法是创建一个单独的.h文件ASubclass.h,例如,并添加如下内容:

@interface A (Protected)

@property (nonatomic, readonly) NSUInteger prop;

@end
然后子类可以导入这个.h,并且可以访问这个方法。请注意,由于类别无法添加属性,因此必须在A的私有接口类扩展中重新定义此属性。然后,该类别将提供对此属性的公共访问。Apple在uigestureRecognitzer.h和uigestureRecognitzerSubclass.h中采用了这种精确的方法,其中uigestureRecognitzer.h公开了更多方法,以供子类重写

就这一点而言,受保护或私有方法的概念并不存在,这只是实现类似功能的一种方式


就我个人而言,我只是在类的唯一一个.h文件中创建了一个类别,它公开了一个其他公共属性。通过这种方式,它与主公共接口分离,而且既然可以访问私有属性,我认为这种方法已经足够好了。

另一种常见的方法是创建一个单独的.h文件ASubclass.h,例如,并添加如下内容:

@interface A (Protected)

@property (nonatomic, readonly) NSUInteger prop;

@end
然后子类可以导入这个.h,并且可以访问这个方法。请注意,由于类别无法添加属性,因此必须在A的私有接口类扩展中重新定义此属性。然后,该类别将提供对此属性的公共访问。Apple在uigestureRecognitzer.h和uigestureRecognitzerSubclass.h中采用了这种精确的方法,其中uigestureRecognitzer.h公开了更多方法,以供子类重写

就这一点而言,受保护或私有方法的概念并不存在,这只是实现类似功能的一种方式


就我个人而言,我只是在类的唯一一个.h文件中创建了一个类别,它公开了一个其他公共属性。通过这种方式,它与主公共接口分离,而且由于可以访问私有属性,我认为这种方法已经足够好了。

请注意,与我的回答不同,这要求您在主类接口或类扩展中单独重新定义或以其他方式提供属性的访问器方法。在子类标题中使用类扩展而不是命名类别没有这个问题。@AndrewMadsen:我以为只能有一个类扩展?还是每.h一个类扩展名?@Scott,不,据我所知,一个类的类扩展名数量没有限制,而且它们不必每-.h一个分开。毕竟,当你导入一个.h时,它基本上是与正在编译的文件内联插入的。对于单个类,它有三个类扩展,编译和运行都很好:注意,与我的回答不同,这要求您在主类接口或类扩展中分别重新定义或以其他方式为属性提供访问器方法。在子类标题中使用类扩展而不是命名类别没有这个问题。@AndrewMadsen:我以为只能有一个类扩展?还是每.h一个类扩展名?@Scott,不,据我所知,一个类的类扩展名数量没有限制,而且它们不必每-.h一个分开。毕竟,当你导入一个.h时,它基本上是与正在编译的文件内联插入的。该类具有针对单个类的三个类扩展,可以很好地编译和运行: