您是否必须在dealloc中发布IBOulets?我不确定这个,因为我没有做alloc,通常你只发布你所谓的alloc.谁知道?
mah*_*udz 35
您的IBOutlets可能是@properties.如果它们是,并且您具有retain属性,那么您确实需要释放-dealloc
换一种说法:
@interface MyViewController : UIViewController {
IBOutlet UITableView *myTable;
}
@property (nonatomic, retain) IBOutlet UITableView *myTable;
@end
Run Code Online (Sandbox Code Playgroud)
你必须[myTable release];在你的dealloc.
如果您在Xcode中创建一个新的基于导航的应用程序,并查看appdelegate.h:
@interface Untitled1AppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
UINavigationController *navigationController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@end
Run Code Online (Sandbox Code Playgroud)
和appdelegate.m的dealloc:
- (void)dealloc {
[navigationController release];
[window release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
这里看到的关键是这样的行:
@property (nonatomic, retain) IBOutlet UIWindow *window;
Run Code Online (Sandbox Code Playgroud)
如果存在保留,则表示该属性由您的代码"拥有",您必须将其释放.
当然,还有其他方法,例如不将IBOutlets声明为属性,或者将它们声明为属性而不保留.我发现在大多数情况下,我更喜欢将它们保留为属性,然后我必须明确地释放它们.例如,当您从一个视图控制器切换到另一个视图控制器时.当一个视图控制器被关闭时,其视图将被删除并被释放.如果我没有保留它们,该视图上的任何IBOutlet UILabel也将被释放.这意味着当我回到原来的视图时,我必须通过并将标签和控件重置为最后的值,如果我只保留IBOutlet,我可以轻松保存它们.
如果您只是在界面中使用IBOutlet,则无需释放它们.原因在于,除非您在代码中明确地保留它们,否则它们只是被设置.他们留下来因为视野在那里.显然,如果你也使用属性并保留它们,你需要在dealloc上发布.
这不是关于IBOutlet,而是关于你的声明.如果您在Xcode中使用新的项目向导,您可能会在头文件中获得这样的代码.
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
Run Code Online (Sandbox Code Playgroud)
你可以看到,头文件中有retain关键字.遵循内存管理准则,您必须释放您保留的所有内容(通过调用alloc,copy,retain等).并且您已保留在代码中,那么您必须将其释放.
此外,该向导已经为您添加了一些发布代码.
- (void)dealloc {
[tabBarController release];
[window release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11075 次 |
| 最近记录: |