在我的UIViewController
子类中,我有3 UIView
个,每个@property
为IBOutlet
。我的代码中根本不使用这些属性。一旦创建了视图控制器,视图就会被实例化,并且在取消分配视图控制器时会释放它们。
我在想;我不能删除@property
的?我做了,我仍然可以在Interface Builder中连接我的实例变量(IBOutlet
)。
所以现在我的问题是; 是否有与Interface Builder结合使用的属性,或者可以将它们删除?某些内存管理是否需要它?或者他们真的只是在你自己的代码中使用?
如果我确实将它们排除在外,我是否还需要release
dealloc
中的{{1}}个人?
答案 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加载器可以进行连接。
但你真的应该考虑使用合成属性而不是手写访问器。这更不容易出错,因为它不需要那么多的样板代码。你写的代码越少越好。