IBOutlets应该是ivars还是属性?

时间:2012-04-26 08:51:01

标签: objective-c ios properties iboutlet ivar

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

到目前为止,我有三种选择:

  1. 仅限ivar
  2. 仅限属性
  3. 以ivar支持的财产
  4. 当我尝试通过从IB拖入我的ViewController来自动生成属性时,Xcode当前崩溃,但是从我记忆中,这样做会创建一个没有ivar的属性。也可以拖入ivar部分,这将创建一个没有属性的ivar。这表明只有财产和仅使用ivar的商店才适合苹果。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

//.m
@synthesize myLabel;

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

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

Apple Memory Management guide表示当您拥有非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。这是关于笔尖和内存管理的非常酷的文章。

希望它有所帮助。

答案 1 :(得分:1)

这是我的理解

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

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

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