Выделенный NSMutableArray? - PullRequest
       24

Выделенный NSMutableArray?

0 голосов
/ 08 января 2012

Я не могу понять, что я делаю неправильно с NSMustableArray.Справедливо сказать, что я не очень хорошо понимаю распределение памяти, поэтому я прошу прощения, если это простые вопросы.

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

В .h у меня есть

@interface BurnsCalculatorViewController : UIViewController// <UIPickerViewDelegate, UIPickerViewDataSource>
{
    UIView              *frontView;
    UIView              *backView;
    UIButton            *frontButton;
    UIButton            *backButton;
    NSMutableArray      *frontBurnsArray;
}

@property (nonatomic, retain) UIView            *frontView;
@property (nonatomic, retain) UIView            *backView;
@property (nonatomic, retain) UIButton          *frontButton;
@property (nonatomic, retain) UIButton          *backButton;
@property (nonatomic, retain) NSMutableArray    *frontBurnsArray;

-(IBAction)frontButtonSelect:(id)sender;
-(IBAction)backButtonSelect:(id)sender;

@end

Тогда у меня есть файл .m

@implementation BurnsCalculatorViewController

@synthesize frontView;
@synthesize backView;
@synthesize frontButton;
@synthesize backButton;
@synthesize frontBurnsArray;

-(IBAction)frontButtonSelect:(id)sender
{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:[self view] cache:YES];
    [self.view addSubview:backView];
    [self.view addSubview:backButton];
[UIView commitAnimations];
    NSLog(@"%@", frontBurnsArray);
}

-(IBAction)backButtonSelect:(id)sender
{
    [UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:[self view] cache:YES];
    [self.view addSubview:frontView];
    [self.view addSubview:frontButton];
[UIView commitAnimations];
    NSLog(@"%@", frontBurnsArray);
}

-(void)viewDidLoad
{
    frontBurnsArray = [NSMutableArray arrayWithObjects: @"frontHead", @"frontChest", @"frontAbdomen", @"frontGroin",@"frontLeftArm", @"frontLeftForeArm", @"frontRightArm", @"frontRightForearm", @"frontLeftThigh", @"frontLeftLowerLeg", @"frontRightThigh", @"frontRightLowerLeg",nil];

    CGRect viewframe = CGRectMake(0, 0, 320, 480);
    frontView = [[UIView alloc] initWithFrame:viewframe];
    frontView.backgroundColor = [UIColor blueColor];
    [self.view addSubview:frontView];

    frontButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [frontButton addTarget:self action:@selector(frontButtonSelect:) forControlEvents:UIControlEventTouchDown];
    [frontButton setTitle:@"Show Back" forState:UIControlStateNormal];
    frontButton.frame = CGRectMake(210, 10, 100, 30);
    [self.view addSubview:frontButton];

    backView = [[UIView alloc] initWithFrame:viewframe];
    backView.backgroundColor = [UIColor blackColor];
    backButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
    [backButton addTarget:self action:@selector(backButtonSelect:)forControlEvents:UIControlEventTouchDown];
    [backButton setTitle:@"Show Front" forState:UIControlStateNormal];
    backButton.frame = CGRectMake(210, 10, 100, 30);
}

-(void)dealloc
{
    [super dealloc];
    [frontButton release];
    [backButton release];
    [frontBurnsArray release];
}
@end

Я не могу понять, почему NSLogs в IBActions сообщают мне, что экземпляр был освобожден.Помимо «релиза» в dealloc, я сказал, что сохранил массив и не выпустил его где-либо еще.

Я потратил целую вечность, пытаясь найти ответ на этот вопрос, но просто не могу понять это.

Спасибо !!

1 Ответ

2 голосов
/ 08 января 2012
frontBurnsArray = [NSMutableArray arrayWithObjects: @"frontHead", @"frontChest", @"frontAbdomen", @"frontGroin",@"frontLeftArm", @"frontLeftForeArm", @"frontRightArm", @"frontRightForearm", @"frontLeftThigh", @"frontLeftLowerLeg", @"frontRightThigh", @"frontRightLowerLeg",nil];

Вы не используете сохраняющее свойство

try

self.frontBurnsArray = [NSMutableArray arrayWithObjects: @"frontHead", 
                                                         @"frontChest",
                                                         @"frontAbdomen", 
                                                         //....
                                                         nil];

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

frontBurnsArray = [[NSMutableArray arrayWithObjects: @"frontHead", 
                                                         @"frontChest",
                                                         @"frontAbdomen", 
                                                         //....
                                                         nil] retain];
...