为啥默认 Storyboard 应用程序有第二个接口声明
Posted
技术标签:
【中文标题】为啥默认 Storyboard 应用程序有第二个接口声明【英文标题】:Why do default Storyboard apps have a second interface declaration为什么默认 Storyboard 应用程序有第二个接口声明 【发布时间】:2012-02-27 20:28:22 【问题描述】:对不起,如果这很愚蠢......但这让我感到困惑?......
我正在使用 Xcode 尝试一个新的故事板应用程序,只是问自己为什么在我的实现文件中有第二个 @interface 声明?
.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
....
@end
【问题讨论】:
【参考方案1】:请参阅 Apple 的文档:https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocCategories.html
它是一个类扩展,与类别略有不同,因为它在括号内没有名称。您可以使用它来声明旨在保持私有(在标头之外)的属性和方法,并将公共只读属性和方法重新声明为私有读写。这允许更清晰的封装。
根据要求,一个友好的例子:
JYDuckPondManager.h
@interface JYDuckPondManager : NSObject
@property (nonatomic, assign, readonly) NSUInteger duckCount;
@property (nonatomic, assign, readonly) CGFloat waterLevel;
- (JYDuckReaction *)feedDucks:(JYDuckFood *)food;
- (JYDuckReaction *)harassDucks:(JYDuckTaunt *)taunt;
@end
JYDuckPondManager.m(扩展,省略假想实现)
@interface JYDuckPondManager ()
//// Redefined for internal modification
@property (nonatomic, assign, readwrite) NSUInteger duckCount;
@property (nonatomic, assign, readwrite) CGFloat waterLevel;
//// Internally exclusive properties
@property (nonatomic, strong) NSSet *duckPersonalitySet;
@property (nonatomic, assign) CGFloat flockAnxietyLevel;
//// Private messages
- (void)recalculatePondState;
@end
其他对象应该能够与池塘交互,但它们不应该知道池塘中发生的某些事情或重新定义池塘的统计数据。在 .m 扩展名中保留具体细节可确保 .h 简洁且受到适当限制。
【讨论】:
需要此功能的典型用例是什么?【参考方案2】:.m 文件中的第二个 @interface 块是扩展名。您可以为要在类内部使用的方法和实例变量添加声明。
【讨论】:
【参考方案3】:第二个接口@interface ViewController ()
是一个类扩展,类似于匿名类别。类扩展被声明为没有名称的类别。在这些扩展中找到的声明直接扩展了在类的主要 @interface
中找到的声明,并且有时可以(在某些情况下)覆盖在主要接口中找到的声明。
【讨论】:
以上是关于为啥默认 Storyboard 应用程序有第二个接口声明的主要内容,如果未能解决你的问题,请参考以下文章
如何加载存在于 Xamarin.iOS 中的共享库项目中的第二个 Storyboard
iOS 8 导航栏在 Storyboard 上的第二个 ViewController 中无法访问