如果我定义了这个类,如何在没有编译器错误的情况下访问子类中的someObject属性?

@interface MyBaseClass
  // someObject property not declared here because I want it to be scoped 
  // protected. Only this class instance and subclass instances should be
  // able to see the someObject property.
@end

// This is a private interface extension...properties declared here
// won't be visible to subclasses. However, I don't see any way to 
// declare protected properties...
@interface MyBaseClass (private)
   @property (nonatomic, readwrite, retain) NSObject *someObject;
@end

@interface MySubclass : MyBaseClass 
@end

@implementation MySubclass

- (id) init {
    // Try to do something with the super classes' someObject property. 
    // Always throws compile errors.

    // Semantic Issue: Property 'someObject' not found 
    // object of type 'MySubclass *'
    self.someObject = nil; 

}
@end



推荐答案

您想要的解决方案是在类扩展中声明MyBaseClass私有属性:

@interface MyBaseClass ()
@property (nonatomic, readwrite, retain) NSObject *someObject;
@end

然后,您可以在MyBaseClass and的MySubclass中自由地声明both.这让MySubclass知道这些属性,以便其代码可以讨论它们.

如果重复让你感到不安,把课程扩展放在一个.h文件,并将其导入两者.m文件.

我将从自己的代码中给出一个示例.这里是MyDownloaderPrivateProperties.h:

@interface MyDownloader ()
@property (nonatomic, strong, readwrite) NSURLConnection* connection;
@property (nonatomic, copy, readwrite) NSURLRequest* request;
@property (nonatomic, strong, readwrite) NSMutableData* mutableReceivedData;
@end

没有相应的.m文件,这就是这个文件中的全部内容;它可以说是纯粹的声明性的.下面是MyDownloader.m的开始:

#import "MyDownloader.h"
#import "MyDownloaderPrivateProperties.h"
@implementation MyDownloader
@synthesize connection=_connection;
@synthesize request=_request;
@synthesize mutableReceivedData=_mutableReceivedData;
// ...

下面是其子类MyImageDownloader.m的开始:

#import "MyImageDownloader.h"
#import "MyDownloaderPrivateProperties.h"

问题解决了.隐私是被保护的,因为这些是唯一导入MyDownloaderPrivateProperties.h的类,所以就编译器而言,它们是唯一知道这些属性的类(这就是Objective-C中的隐私).子类可以访问其访问器由超类合成的私有属性.我相信这就是你一开始想要实现的.

Objective-c相关问答推荐

CoreData:错误:无法在 NSManagedObject 类上调用指定的初始化程序

如何通过仅更改高度而不更改宽度来调整 UILabel 的大小?

来自 NSDate 的日期名称?

如何追踪 SIGABRT 的原因

如何将 UInt32 设置为最大值

具有匿名函数/块的 NSTimer?

iOS:将 URL 解析为段

静态 NSString 使用与内联 NSString 常量

UIScreen MainScreen Bounds 返回错误的大小

.delegate=self 是什么意思?

我如何使用 initWithCoder 方法?

设置数据后调整 UICollectionView 单元格的大小

在 Objective-C 中,你在哪里声明一个常量?

添加/删除带有动画的 UITableViewCell?

主队列上的 performSelectorOnMainThread: 和 dispatch_async() 有什么区别?

如何为 iPhone 应用程序创建多个主题/皮肤?

以编程方式设置 UIView 的自动调整大小掩码?

Objective-c - CABasicAnimation 在动画后应用更改?

iOS:开源 VoIP/SIP Objective-C 代码

公开只读但具有私有设置器的 Objective-C 属性