Ios 创建IBOutlet的不同方法

Ios 创建IBOutlet的不同方法,ios,objective-c,iboutlet,Ios,Objective C,Iboutlet,至少有3种方法可以在Objective-C中创建IBOutlet,用于在Xcode 8中制作iOS 10应用程序 方法1:inViewController.h @interface ViewController : UIViewController @property (nonatomic, strong) UILabel *textLabel; @end @interface ViewController () { IBOutlet UILabel *textLabel; } @e

至少有3种方法可以在Objective-C中创建
IBOutlet
,用于在Xcode 8中制作iOS 10应用程序

方法1:in
ViewController.h

@interface ViewController : UIViewController
@property (nonatomic, strong) UILabel *textLabel;
@end
@interface ViewController () {
    IBOutlet UILabel *textLabel;
}

@end
@interface ViewController () 
@property (nonatomic, strong) UILabel *textLabel;
@end
方法二:在
ViewController.m

@interface ViewController : UIViewController
@property (nonatomic, strong) UILabel *textLabel;
@end
@interface ViewController () {
    IBOutlet UILabel *textLabel;
}

@end
@interface ViewController () 
@property (nonatomic, strong) UILabel *textLabel;
@end
方法3:在
ViewController.m
的界面中,使用
@property

@interface ViewController : UIViewController
@property (nonatomic, strong) UILabel *textLabel;
@end
@interface ViewController () {
    IBOutlet UILabel *textLabel;
}

@end
@interface ViewController () 
@property (nonatomic, strong) UILabel *textLabel;
@end

鉴于必须访问
文本标签
,且其文本需要经常更新,那么哪种方法才是正确的方法?

这取决于您是否需要您的插座才能访问包含插座以外的类;一般来说,我不鼓励这样做,因为让视图控制器负责更新UI,而不是将此任务传递给其他类是一种很好的做法。话虽如此,方法3将是最好的选择,但是,如果您确实必须从另一个类访问对象,那么只需使用方法1,即可将其显示在类标题中


方法2使用IVAR而不是对象属性,并且不是声明出口的正确方法,它甚至可能导致意外行为,因此最好避免使用此方法。

这一切取决于您是否需要出口访问包含出口之外的类;一般来说,我不鼓励这样做,因为让视图控制器负责更新UI,而不是将此任务传递给其他类是一种很好的做法。话虽如此,方法3将是最好的选择,但是,如果您确实必须从另一个类访问对象,那么只需使用方法1,即可将其显示在类标题中


方法2使用IVAR而不是对象属性,并且不是声明出口的正确方法,它甚至可能导致意外行为,因此最好避免使用此方法。

您的代码不包含正确的
IBOutlet
。插座连接到故事板

方法1

这是一处房产。由于它位于.h文件中,所以可以从外部访问它。
public
的Objective-C模式

方法2

这是一个iVar。如果不需要,请不要使用IVAR

方法3

这是一处房产。由于它位于.m文件中,因此无法从外部访问它。
private
的Objective-C模式

方法4

合适的
IBOutlet
如下所示:

@interface ViewController ()
    @property (nonatomic, weak) IBOutlet UILabel *label;
@end
这是一个简单的属性。您必须根据是否要发布它来决定是否将其放入.h或.m文件中

IBOutlet
只是使属性能够连接到故事板。它是Xcode的注释,不会改变代码的语义


编辑1:

正如Sulthan在评论中正确提到的:


在大多数情况下,正确的设计模式是隐藏插座,因为这是一个实现细节。外部类不应直接使用视图设置数据


编辑2:

为什么“如果不必使用IVAR,就不使用IVAR”(2)

基于意见的:

我认为使用Goter和SeTeTs(因此不直接访问变量)是很好的面向对象编程实践。另外,正如您所知,在读取

x=self.variable
(属性)和
x=variable
(局部变量)时,代码更容易阅读


如果出于某种原因必须使用iVars,通常(我建议)在名称前面加上
\uuu
x=_变量
(iVar)。

您的代码不包含正确的
IBOUTLE
。插座连接到故事板

方法1

这是一处房产。由于它位于.h文件中,所以可以从外部访问它。
public
的Objective-C模式

方法2

这是一个iVar。如果不需要,请不要使用IVAR

方法3

这是一处房产。由于它位于.m文件中,因此无法从外部访问它。
private
的Objective-C模式

方法4

合适的
IBOutlet
如下所示:

@interface ViewController ()
    @property (nonatomic, weak) IBOutlet UILabel *label;
@end
这是一个简单的属性。您必须根据是否要发布它来决定是否将其放入.h或.m文件中

IBOutlet
只是使属性能够连接到故事板。它是Xcode的注释,不会改变代码的语义


编辑1:

正如Sulthan在评论中正确提到的:


在大多数情况下,正确的设计模式是隐藏插座,因为这是一个实现细节。外部类不应直接使用视图设置数据


编辑2:

为什么“如果不必使用IVAR,就不使用IVAR”(2)

基于意见的:

我认为使用Goter和SeTeTs(因此不直接访问变量)是很好的面向对象编程实践。另外,正如您所知,在读取

x=self.variable
(属性)和
x=variable
(局部变量)时,代码更容易阅读


如果出于某种原因必须使用iVars,通常(我建议)在名称前面加上
\uuu
x=_variable
(iVar)。

除了@Jacob King comments这是很好的洞察之外,尝试使用方法1作为外部类的公共访问。也要使属性变弱而不是变强,因为如果处理不当,不会增加保留周期或内存泄漏。除了@Jacob King comments(这是很好的洞察)之外,尝试使用方法1作为外部类的公共访问。也要使属性变弱而不是变强,因为如果处理不当,不会增加保留周期或内存泄漏。在大多数情况下,正确的设计模式是隐藏插座,因为这是一个实现细节。外部类不应直接使用视图设置数据。@Sulthan完全同意。我认为这更像是一个技术问题。这两种方法的区别是什么