您是否必须在dealloc中发布IBOulets?

ero*_*ppa 26 iphone

您是否必须在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,我可以轻松保存它们.


ZaB*_*anc 9

如果您只是在界面中使用IBOutlet,则无需释放它们.原因在于,除非您在代码中明确地保留它们,否则它们只是被设置.他们留下来因为视野在那里.显然,如果你也使用属性并保留它们,你需要在dealloc上发布.


iwa*_*wat 8

这不是关于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)