Objective c 为什么IBOutlet属性在类扩展中声明?

Objective c 为什么IBOutlet属性在类扩展中声明?,objective-c,xcode,interface-builder,Objective C,Xcode,Interface Builder,当我创建一个新的单视图应用程序时,生成的UIViewController文件在实现文件中有一个扩展名(我认为它是一个扩展名) // // ViewController.m // #import "ViewController.h" @interface ViewController () @end @implementation ViewController //... @end 按照惯例,IBOutlets在这个扩展中被声明为属性。为什么会这样?这会导致与在头文件接口中声明不同

当我创建一个新的单视图应用程序时,生成的UIViewController文件在实现文件中有一个扩展名(我认为它是一个扩展名)

//
//  ViewController.m
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

//...

@end

按照惯例,IBOutlets在这个扩展中被声明为属性。为什么会这样?这会导致与在头文件接口中声明不同的哪种行为?

头文件中的属性是公共的,实现文件中的属性声明是私有的。这取决于你的选择。您可以将它们直接从interface builder连接到所需的文件中。
我无法理解您对扩展的担忧-这段代码很好。你能解释一下吗?(我不能发表评论-太少的声誉,对不起)

这是架构。不要让其他类看到内部。控制器的全部目的是控制它所拥有的视图。其他班级甚至不应该看到风景。这是唯一的原因吗?安全对不起,这个简单的问题,可能对每个人来说都是显而易见的。我是个新手,所以我问的很多问题对其他人来说都是显而易见的。这与安全性完全无关。它的体系结构——良好的代码和关注点分离。让其他类看到一个干净的接口,不要让它们看到内部。我以为这就是代码安全性?隐藏内部,使其不会被外部破坏?不,隐藏内部是为了更好的架构。程序员仍然可以使用反射来访问它们,因此它与安全性无关。Obj-C不包含任何可能阻止程序员访问您的内部构件的语法。尽管如此,让它们从外部看不见对架构还是有好处的。我相信
@interface ViewController()
是一个类扩展。IBOutlet属性通常在这里声明,您只能将对象拖动到此扩展来声明IBOutlet。拖动到头文件将不起作用。我想知道为什么要使用扩展名来声明IBOutlets。拖动到头文件界面确实有效,请尝试在拆分视图中同时打开interface builder和头文件,这对于拖动IBOutlets非常方便。我刚在谷歌上搜索了一下,似乎是的,接口有点像扩展。哦,现在我试了一下,我发现它可以工作了。以前没工作过。我想知道在头文件中声明IBOutlets的用例是什么。扩展名与头文件中的常规接口有点不同,我认为它是一种特殊的类别。例如,如果您对类进行子类化,则只有在头文件中声明了该属性时,子类才能访问该属性。@Adriano将单词“access”替换为单词“see”。标题不限制您可以访问的内容。它们只限制你能看到的东西。