我根据此Tutorial创建了一个多视图应用。这是我在 appdelegate.h中的代码
@class Disclaimerviewcontroller;
@interface GAINSAppDelegate : NSObject <UIApplicationDelegate> {
Disclaimerviewcontroller *firstview;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain )Disclaimerviewcontroller *firstview;
-(void)switchview :(UIView *)view1 toview:(UIView *)view2;
@end
并且在“.m”中我有以下
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
[self.window makeKeyAndVisible];
Disclaimerviewcontroller *aview = [[Disclaimerviewcontroller alloc]initWithNibName:@"Disclaimerviewcontroller"bundle:nil];
self.firstview = aview;
[_window addSubview:aview.view];
[aview release];
return YES;
}
-(void)switchview :(UIView *)view1 toview:(UIView *)view2{
[UIView beginAnimations:@"Animation" context:nil];
[UIView setAnimationDuration:0.50];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.window cache:YES];
[view1 removeFromSuperview];
[_window addSubview:view2];
[UIView commitAnimations];
}
和dealloc
- (void)dealloc
{ [firstview release];
[_window release];
[super dealloc];
}
从那时起,当我想切换到另一个视图时,我使用以下代码
-(IBAction)switchtodisclaimer2:(id)sender{
GAINSAppDelegate *delegate = (GAINSAppDelegate *)[[UIApplication sharedApplication]delegate];
Disclaimerviewcontrller2 *disclaimview2 = [[Disclaimerviewcontrller2 alloc]initWithNibName:@"Disclaimerviewcontrller2" bundle:nil];
[delegate switchview:self.view toview:disclaimview2.view];
}
就像在教程中一样。但是当我做分析测试时。 xcode警告上述代码中可能存在内存泄漏。所以我添加了(在上面的例子中)[disclaimerview2 release];
,当我运行程序时,我得到EX_BAD_ACCES
错误。我以为它是initwithnibname,它是一个自动释放?我现在很困惑。该教程似乎根本没有解决这个问题。
答案 0 :(得分:0)
在某些情况下,即使没有分析仪,分析仪也会发出警告。如果您通过Instruments应用程序运行应用程序,然后查看是否确实存在内存泄漏,那会更好。
答案 1 :(得分:0)
据我所知,方法initWithNibName
返回并且没有自动释放的对象。你应该用
[[[Disclaimerviewcontrller2 alloc]initWithNibName:@"Disclaimerviewcontrller2" bundle:nil] autorelease];
。
或者,您可以将disclaimerview2
保存为属性并释放dealloc方法中的内存(不使用自动释放)。
希望这有帮助。
答案 2 :(得分:0)
内存所有权的规则是:
如果您的方法名称以'alloc','init','copy','mutableCopy'或'new'开头,那么您有责任通过
release
或autorelease
释放它
所以是的,你确实有内存泄漏所以你应该用[disclaimview2 release]
但是,您崩溃的原因是因为您的代码中存在另一个错误。
如果您要将其传递给您的委托,您的委托应该保留 - 否则,委托将在未来的某个时候尝试使用它,但会被解除分配。