为啥默认 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 应用程序有第二个接口声明的主要内容,如果未能解决你的问题,请参考以下文章

有第二个带有 ajax 的下拉列表

如何加载存在于 Xamarin.iOS 中的共享库项目中的第二个 Storyboard

为啥CPU使用率不增加?

iOS 8 导航栏在 Storyboard 上的第二个 ViewController 中无法访问

从第二个 ViewController 回到第一个 ViewController

ViewController创建过程使用storyboard