我一直在试图找到一种解决方法,在Objective-C中声明@protected属性,这样只有层次 struct 中的子类才能访问它们(只读,而不是写).

层次 struct 顶部的每个自定义类都包含三个类、一个实现和两个接口.

ClassA.h
ClassA_protected.h
ClassA.m

那么这个ClassA的任何子类都会像往常一样:

ClassB.h
ClassB.m

首先,我创建了接口ClassA.h,在这里我声明了一个受保护的int变量,这样ClassA的任何子类都可以访问它:

@interface ClassA : NSObject{
    @protected
    int _myProtectedInt;
}
@end

下一步是我刚才提到的解决方法.然而,一旦你读了它,你就会发现它非常直截了当.我声明了第二个名为ClassA_protected.h的接口,它实际上是ClassA的extension.h并允许我们将该房产标记为readonly:

#import "ClassA.h"
@interface ClassA ()
@property (nonatomic , readonly) int myProtectedInt;
@end

准备受保护层次 struct 的最后一步是在ClassA.m中声明它的实现,我们只合成我们的属性:

#import "ClassA_protected.h"
@implementation ClassA
@synthesize myProtectedInt = _ myProtectedInt;
@end

这样,每个需要是ClassA.h的子类的类都将导入ClassA_protected.h.因此,一个像ClassB.h这样的子元素应该是这样的:

#import "ClassA_protected.h"
@interface ClassB : ClassA
@end

以及从ClassB.m的实现中访问此属性的示例:

@implementation ClassB
-(void) method {
    //edit protected variable 
    _myProtectedInt= 1;

    //normal access
    self.muProtectedInt;
}
@end

推荐答案

当然,这很好.苹果公司使用同样的方法,例如在UIGestureRecognizer类中.子类必须导入额外的UIGestureRecognizerSubclass.h文件,并重写该文件中声明的方法.

Objective-c相关问答推荐

如何从 Cocoa 的 NSDictionary 中获取特定键的值?

在没有for循环的情况下获取另一个数组中每个对象的属性值数组

如何在情节提要中为视图控制器提供标识符?

如何将变量参数传递给另一个方法?

如何在 iOS Objective-C 头文件中将函数标记为已弃用?

为什么 UICollectionView 的 UICollectionViewCell 没有在用户时突出显示?

iOS 指定初始化器:使用 NS_DESIGNATED_INITIALIZER

如何更改图像 tintColor

如何获取 NSArray 的最后一个对象

为什么我的 UIButton 的内部修饰事件没有被调用?

右对齐的 UITextField 空格键在 iOS 7 中不前进光标

ios 13 - 带有 UISearchBar _searchField 的自定义 SearchBar 不起作用

只有 ONE VIEW 横向模式

Objective-C (cocoa) 等价于python的endswith/beginswith

动态转发: suppress Incomplete Implementation 警告

在运行时判断 iOS 版本?

iOS 内存分配 - 一个应用程序可以使用多少内存?

访问当前视图的父视图 - iOS

Objective C 中的对象分配和初始化

如何在没有死锁的情况下同步调度主队列?