Multiview app内存泄漏警告。

时间:2011-09-02 10:24:56

标签: objective-c ios4 memory-management

我根据此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,它是一个自动释放?我现在很困惑。该教程似乎根本没有解决这个问题。

3 个答案:

答案 0 :(得分:0)

在某些情况下,即使没有分析仪,分析仪也会发出警告。如果您通过Instruments应用程序运行应用程序,然后查看是否确实存在内存泄漏,那会更好。

答案 1 :(得分:0)

据我所知,方法initWithNibName返回并且没有自动释放的对象。你应该用  [[[Disclaimerviewcontrller2 alloc]initWithNibName:@"Disclaimerviewcontrller2" bundle:nil] autorelease];

或者,您可以将disclaimerview2保存为属性并释放dealloc方法中的内存(不使用自动释放)。

希望这有帮助。

答案 2 :(得分:0)

内存所有权的规则是:

  

如果您的方法名称以'alloc','init','copy','mutableCopy'或'new'开头,那么您有责任通过releaseautorelease释放它

所以是的,你确实有内存泄漏所以你应该用[disclaimview2 release]

发布'disclaimview2'

但是,您崩溃的原因是因为您的代码中存在另一个错误。

如果您要将其传递给您的委托,您的委托应该保留 - 否则,委托将在未来的某个时候尝试使用它,但会被解除分配。