繁体   English   中英

IBOutlets应该是ivars还是属性?

[英]Should IBOutlets be ivars or properties?

虽然我确信它们存在,但我很难找到或确定在ViewController中声明出口的官方最佳实践。

到目前为止,我可以看到3个选项:

  1. 仅限ivar
  2. 仅限物业
  3. 以伊瓦尔为背景的财产

当我尝试通过从IB拖入我的ViewController来自动生成属性时Xcode当前崩溃,但是从我记忆中,这样做会创建一个没有ivar的属性。 也可以拖入ivar部分,这将创建一个没有属性的ivar。 这表明,仅限房产和仅使用ivar的商店对苹果都是好的。

所以在viewDidUnload中我们需要为任何一个出口分配nil,但是dealloc呢。 如果我们使用没有ivar的属性,我们如何释放我们的插座,我们不应该在init或dealloc中使用任何访问器?

在我看来,唯一允许我们在没有访问器的情况下释放我们的插座的模式是使用支持ivar的属性,因此我们可以在dealloc中手动释放我们的ivar而不使用其访问器,但是这是Apple的一个选项。代码生成不支持。

根据经验,我通常会为IBOutlet创建访问器。

在ARC或非ARC项目中,我通常会执行以下操作:

//.h (ARC)
@property (nonatomic, weak) IBOutlet UILabel* myLabel;

//.h (non-ARC)
@property (nonatomic, retain) IBOutlet UILabel* myLabel;

//.m
@synthesize myLabel;

通过这种方式,您可以让编译器为您创建实例变量。 但是您也可以声明您的实例变量并告诉编译器使用它。

然后,您可以在任何位置使用该访问器/实例变量。

Apple内存管理指南说,当您有非ARC项目时,必须避免使用initdealloc方法中的访问器方法。 所以,例如:

// (non-ARC)
- (void)dealloc
{
   [myLabel release]; myLabel = nil; // I'm using the instance variable here!
   [super dealloc];       
}

这在非ARC项目中非常重要。 原因是,如果没有访问器,KVC会将nib对象分配给实例变量,并对其进行保留。 如果您忘记释放它,可能会发生内存泄漏。 使用访问器强制您最后释放该对象。

我强烈建议阅读迈克·艾什(Mike Ash) 周五-Qa-2012-04-13-nib-memory-management 这是关于笔尖和内存管理的非常酷的文章。

希望能帮助到你。

这是我的理解

使用将由其他类访问的变量的属性,从(getters)读取或写入(setter)。 两个setter和getter都是为了属性而合成的。

将ivars用于仅由拥有类在内部使用的变量,也就是说,其他类不会设置或获取其值。

当然,您可以使用属性代替ivars,但只要访问它们就会产生函数调用开销。 因此,如果您的类有一个内部变量很多,那么函数调用将影响实时性能,这可以通过将它们声明为ivars来避免。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM