如何创建一个新的Foo类实例而不在接口中公开它的构造函数?

时间:2012-03-29 13:58:56

标签: objective-c ios

这与NewsstandKit.framework并不严格相关,但这里有一个实用的例子:

addIssueWithName:date:的{​​{1}}实例方法会创建报刊亭问题 - NKLibrary - 并将其添加到内容库中,如果出现非故障,则将其返回。此时NKIssue实例的NKIssuename属性设置为最初传递给date的值。

如果你检查出来,addIssueWithName:date:类没有特定的初始化方法(除了从NKIssue继承的普通init)和NSObject实例变量(例如@public_name)及其属性均为_date

所以我不明白整个事情在内部如何运作?我很乐意在我的一个库中模仿这种方法,但无法弄清楚如何......

感谢。

1 个答案:

答案 0 :(得分:0)

Apple的代码可以访问Apple的代码。 readonly的{​​{1}}属性很可能在类扩展中重新声明为NKIssue。请查看TOCPL中的"Property Redeclaration"

在标题中,您会看到:

readwrite

在实现文件(或其他私有文件)中,有一个具有相同属性的类扩展,具有完全相同的属性(这是必需的),除了@interface Carborundum : NSObject @property (readonly, copy, nonatomic) NSString * whiskers; @property (readonly, retain, nonatomic) NSDate * inception; @end

readonly

它们像往常一样合成:

@interface Carborundum ()
@property (copy, nonatomic) NSString * whiskers;
@property (retain, nonatomic) NSDate * inception;
@end

这允许可以看到类扩展的代码(即其他UIKit代码)将属性用作读写,而只能访问头的代码仅限于只读版本。这是由编译器强制执行的,而不是运行时。

有相当多的SO问题:https://stackoverflow.com/search?q=%5Bobjc%5D+redeclare+property