IBOutlets应该是ivars还是属性?

Und*_*ion 6 properties objective-c iboutlet ios ivar

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

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

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

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

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

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

Lor*_*o B 1

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

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

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

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

//.m
@synthesize myLabel;
Run Code Online (Sandbox Code Playgroud)

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

然后您可以在任何需要的地方使用该访问器/实例变量。

Apple 内存管理指南指出,当您有非 ARC 项目时,必须避免使用init或中的访问器方法。dealloc因此,例如:

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

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

我强烈建议阅读Mike Ash 撰写的friday-qa-2012-04-13-nib-memory-management。这是一篇关于 nib 和内存管理的非常酷的文章。

希望能帮助到你。