从Objective-C中的子类访问ivar

尤利安·奥诺夫雷(Iulian Onofrei)

我有A在它的.m文件中有此声明的

@implementation A {
    NSObject *trickyObject;
}

B.h文件中有此声明的

@interface B : A
@end

是否有可能trickyObject从类中声明的方法访问B

如果您拥有私有的属性或方法,但是想让子类可以访问它,则可以将声明放在category中

因此请考虑A

//  A.h

@import Foundation;

@interface A : NSObject

// no properties exposed

@end

//  A.m

#import "A.h"

// private extension to synthesize this property

@interface A ()

@property (nonatomic) NSInteger hiddenValue;

@end

// the implementation might initialize this property

@implementation A

- (id)init {
    self = [super init];
    if (self) {
        _hiddenValue = 42;
    }
    return self;
}

@end

然后考虑以下类别:

//  A+Protected.h

@interface A (Protected)

@property (readonly, nonatomic) NSInteger hiddenValue;

@end

请注意,此扩展名不进行合成hiddenValue(其中的私有扩展名是A这样做的)。但这为进口的任何人提供了A+Protected.h访问此属性的机制。现在,在此示例中,尽管hiddenValue确实是readwrite(如的私有扩展中所定义A),但此类别仅公开getter。readonly如果希望它同时公开getter和setter,显然可以省略,但是我将其用于说明性目的。)

无论如何,B现在可以执行以下操作:

//  B.h

#import "A.h"

@interface B : A

- (void)experiment;

// but again, no properties exposed

@end

//  B.m

#import "B.h"
#import "A+Protected.h"

@implementation B

// but with this category, B now has read access to this `hiddenValue`

- (void)experiment {
    NSLog(@"%ld", (long)self.hiddenValue);
}

@end

现在A不公开hiddenValue,但是任何使用此A (Protected)类别的代码(在本例中为B)现在都可以访问此属性。

因此,现在您可以调用B可能使用hiddenValuefrom的方法A,而不必在公共接口中公开它。

//  ViewController.m

#import "ViewController.h"
#import "B.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    B *b = [[B alloc] init];
    [b experiment];          // this calls `B`’s exposed method, and that method is using the property not exposed by `A.h`
}

@end

如果您对真实示例感兴趣,请考虑UIKit:

@import UIKit.UIGestureRecognizerSubclass;

通常state,aofUIGestureRecognizerreadonly,但是此UIGestureRecognizer (UIGestureRecognizerProtected)类别公开了readwrite访问器state(顾名思义,仅用于手势识别器子类)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

iOS Xcode:在Objective-C中访问Ivar的编译器错误

来自分类Dev

C函数访问Objective-C类的私有ivar

来自分类Dev

子类中的Objective-C只读属性

来自分类Dev

Objective-C / ARC ivar与属性

来自分类Dev

Objective-C / ARC ivar与属性

来自分类Dev

带有显式vs隐式self->的Objective-C self-> _ ivar访问

来自分类Dev

在运行时从类外部访问Objective-C ivar

来自分类Dev

Objective-C:授予子类私有变量访问

来自分类Dev

Objective-C:授予子类私有变量访问

来自分类Dev

Objective-C子类设置

来自分类Dev

请求访问Objective-C中的相机

来自分类Dev

访问Objective C中的继承数组

来自分类Dev

在子类中初始化Objective-C属性

来自分类Dev

子类在Objective-C中的前向声明

来自分类Dev

为什么在Objective-C中指向ivar的指针不好?

来自分类Dev

Objective-C可变子类模式?

来自分类Dev

?:在Objective-C中

来自分类Dev

Objective-C:如何从子类访问父私有属性?

来自分类Dev

在Swift应用程序中访问Objective-C sharedInstance

来自分类Dev

在Swift中访问Objective-C的NS_ENUM

来自分类Dev

如何正确同步对Objective-C中的实例变量的访问

来自分类Dev

Swift-在Objective-C类中访问NSArray

来自分类Dev

在Objective-C中以编程方式访问方法参数

来自分类Dev

如何从Objective-C访问Swift中的枚举?

来自分类Dev

从Objective-C文件中的AppDelegate.swift访问UIWindow

来自分类Dev

在Objective-C中控制对实例变量的访问

来自分类Dev

如何在Swift中从Objective-C访问NSMutableArray

来自分类Dev

从Swift中的Objective C项目访问App委托

来自分类Dev

在Objective-C中以编程方式访问方法参数