Interface属性是否需要@ property?

时间:2011-01-02 18:06:27

标签: iphone objective-c cocoa-touch uikit interface-builder

在我的UIViewController子类中,我有3 UIView个,每个@propertyIBOutlet。我的代码中根本不使用这些属性。一旦创建了视图控制器,视图就会被实例化,并且在取消分配视图控制器时会释放它们。

我在想;我不能删除@property的?我做了,我仍然可以在Interface Builder中连接我的实例变量(IBOutlet)。

所以现在我的问题是; 是否有与Interface Builder结合使用的属性,或者可以将它们删除?某些内存管理是否需要它?或者他们真的只是在你自己的代码中使用?

如果我确实将它们排除在外,我是否还需要release dealloc中的{{1}}个人?

5 个答案:

答案 0 :(得分:10)

他们没有必要,但他们强烈鼓励他们澄清内存管理这一简单事实。

例如,如果您通过ivar申报出口,那么它的保留政策是什么?它保留了吗?它是自动释放的吗?你是老板吗?别人也拥有它吗?那里存在很多歧义(尤其是那些被诅咒的顶级对象,其在Mac上的行为与在iPhone上的行为不同)。

另一方面,如果您通过属性声明出口,则不存在歧义,因为内存管理策略直接在声明中声明。除了属性的存在,nib unarchiving将看到setter并使用它,从而确保转移对象所有权等没有什么奇怪的事情。

简而言之,您可以在不使用@property的情况下声明出口(我们在10.5中引入它们之前都必须这样做),但没有充分理由使用它们。它们确实使代码更加清晰,确切地说是什么。

有关nib对象内存管理荒谬性的更多信息,请check out this page in the documentation

答案 1 :(得分:2)

是的,你可以:

@interface SomeClass : UIViewController {
    IBOutlet UILabel *myLabel;
}

@end

@property仅用于定义内存管理,getter和setter,读写能力等。

答案 2 :(得分:2)

使用视图属性有两个原因:

  • 更容易/更安全记忆管理(非常好的理由)
  • 将您的界面暴露给其他人(通常是错误的编码练习)

我总是使用属性来确保我的代码不会崩溃,如果我忘记在viewDidUnload中使IBOutlets无效。毕竟,编写2行代码并不难。

如果您想保存一些打字,请不要声明ivars。下面的代码工作正常:

@interface MyController : UIController {
}
@property (nonatomic, retain) IBOutlet UIImageView* myImage;
@end

@implementation MyController
@synthesize myImage;

- (void) dealloc() 
{ 
   self.myImage = nil;
   [super dealloc];
}    

- (void) viewDidUnload()
{ 
   self.myImage = nil;
   [super viewDidUnload];
}
@end

答案 3 :(得分:1)

如果您不打算从其他视图控制器或对象操作或访问有关视图的信息,并计划在内部使用它们(在拥有视图控制器中),则根本不需要@property个参数。只需在视图控制器的界面中将它们定义为IBOutlet个实例变量。

答案 4 :(得分:0)

Interface Builder或NIB加载程序不依赖于那里的属性。如果可以通过KVC访问连接的变量,则nib加载器可以进行连接。

但你真的应该考虑使用合成属性而不是手写访问器。这更不容易出错,因为它不需要那么多的样板代码。你写的代码越少越好。