7

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

据我所知,有3个选项:

  1. 仅限伊瓦尔
  2. 仅财产
  3. 以 ivar 为后盾的属性

当我尝试通过从 IB 拖入 ViewController 来自动生成属性时,Xcode 当前崩溃,但据我记得,这样做会创建一个没有 ivar 的属性。也可以拖入 ivar 部分,这将创建一个没有属性的 ivar。这表明仅限财产的网点和仅限 ivar 的网点都适用于苹果。

因此,在 viewDidUnload 中,我们需要将 nil 分配给我们的任何出口,但 dealloc 呢?如果我们使用了没有 ivar 的属性,如果我们不应该在 init 或 dealloc 中使用任何访问器,我们如何释放我们的出口?

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

4

2 回答 2

1

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

在 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的 friday-qa-2012-04-13-nib-memory-management。这是一篇关于 nib 和内存管理的非常酷的文章。

希望能帮助到你。

于 2012-04-26T09:42:18.973 回答
1

这是我的理解

对将被其他类访问的变量使用属性,可以从(getter)读取或写入(setter)。setter 和 getter 都是为属性合成的。

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

当然,您可以使用属性代替 ivars,但无论何时访问它们都会产生函数调用开销。所以如果你有一个被你的类访问的内部变量很多,函数调用会影响实时性能,这可以通过将它们声明为 ivars 来避免。

于 2012-10-22T18:02:27.720 回答