Multiview приложение утечки памяти предупреждение. - PullRequest
0 голосов
/ 02 сентября 2011

Я создал многофакторное приложение на основе этого Учебника . Вот мой код в 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];


}

и сделка

- (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 голосов
/ 02 сентября 2011

Насколько мне известно, метод initWithNibName возвращает и объект без авто-релиза. Вы должны использовать [[[Disclaimerviewcontrller2 alloc]initWithNibName:@"Disclaimerviewcontrller2" bundle:nil] autorelease];.

Кроме того, вы можете сохранить disclaimerview2 как свойство и освободить память в методе dealloc (без использования автоматического выпуска).

Надеюсь, это поможет.

0 голосов
/ 02 сентября 2011

Правило владения памятью таково:

Если имя вашего метода начинается с 'alloc', 'init', 'copy', 'mutableCopy' или 'new', за которого вы отвечаетевыпуская его, либо с помощью release, либо с autorelease

Так что да, у вас есть утечка памяти, поэтому вы должны выпустить «disclaimview2» с [disclaimview2 release]

Однако,причина вашего сбоя в том, что где-то в вашем коде есть другая ошибка.

Если вы собираетесь передать ее своему делегату, ваш делегат должен сохранить ее , иначе делегат будетпопытайтесь использовать его в будущем, но его освободят.

0 голосов
/ 02 сентября 2011

Анализатор в некоторых случаях может предупреждать, даже если его нет. Было бы лучше, если бы вы запустили приложение через приложение Instruments и затем увидели, действительно ли существует утечка памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...