NSArray теряет данные в target-c. Может кто-нибудь объяснить, почему? - PullRequest
0 голосов
/ 07 июля 2011

У меня есть nsarray, что когда я NSLog его из одного из моих методов (внутри WorkOutList.m) я могу видеть его содержимое, но когда я пытаюсь заглянуть внутрь него из другого метода внутри WorkOutList. м кажется пустым. Я знаю, что для управления моей памятью нужна какая-то работа, может кто-нибудь помочь объяснить, что здесь происходит?

Я использую popViewControllerAnimated: YES, чтобы вернуть представление из tableView обратно в контроллер представления, но перед тем, как я это сделаю, я установил свой массив в метод внутри WorkOutList. Когда я NSLog этот массив из того же метода, мне возвращаются результаты, однако, когда я NSLog его из другого, где он возвращается пустым.

Мне сказали, что это может быть метод viewDidLoad, где массив является init, но что другой массив в этом методе customWorkouts все еще сохраняет свои данные. Так что я не знаю, любое объяснение было бы очень полезно. Я хочу, чтобы это работало, но я также очень хочу понять это, чтобы я мог правильно приступить к кодированию.

Большое спасибо!

WorkOutList.h

#import <UIKit/UIKit.h>


@interface WorkOutList : UIViewController {

    NSManagedObjectContext *managedObjectContext;
    NSMutableArray *customWorkouts;
    NSArray *passedWorkout;
}

@property(nonatomic, retain)NSManagedObjectContext *managedObjectContext;
@property(nonatomic, retain)NSMutableArray *customWorkouts;
@property(nonatomic, retain)NSArray *passedWorkout;

-(IBAction)customWorkouts:(id)sender;

-(void)passWorkoutBack:(NSArray *)workout;


@end

WorkOutList.m

@implementation WorkOutList

@synthesize managedObjectContext, customWorkouts, passedWorkout;

- (void)viewDidLoad {
    [self setupContext];
    NSLog(@"View Did Load");
    customWorkouts = [[NSMutableArray alloc] init];
    passedWorkout = [[NSArray alloc] init];
    [super viewDidLoad];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self fetchWorkoutList];
    NSLog(@"View will Appear");
    NSLog(@"Array from View Will Appear : %@", passedWorkout);

}

-(IBAction)customWorkouts:(id)sender{
    CoCoachAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    SelectedWorkout *selectedWorkout = [[SelectedWorkout alloc] initWithStyle:UITableViewStyleGrouped];

    [selectedWorkout recieveNeededData:customWorkouts];

    [appDelegate.practiceNavController pushViewController:selectedWorkout animated:YES];
    [selectedWorkout release];
}

-(void)passWorkoutBack:(NSArray *)workout{
    passedWorkout = workout;
    [passedWorkout retain];
}

- (void)dealloc {
    [super dealloc];
}

SelectedWorkout.h

#import <UIKit/UIKit.h>


@interface SelectedWorkout : UITableViewController {


    NSMutableArray *workoutListForTable;
}

@property(nonatomic,retain)NSMutableArray *workoutListForTable;

-(void)recieveNeededData:(NSMutableArray *)workoutList;

@end

SelectedWorkout.m (помимо всего, что нужно для настройки tableView)

    @implementation SelectedWorkout

    @synthesize workoutListForTable;

    -(void)recieveNeededData:(NSMutableArray *)workoutList{

        if (workoutListForTable != workoutList) {
            workoutListForTable = workoutList;  
        }

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        [tableView deselectRowAtIndexPath:indexPath animated:YES];

        CoCoachAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
        WorkOutList *workoutListView = [[WorkOutList alloc]init];

        [workoutListView passWorkoutBack:[workoutListForTable objectAtIndex:indexPath.row]];
        [appDelegate.practiceNavController popViewControllerAnimated:YES];
    }

    - (void)dealloc {

        [workoutListForTable release];
        [super dealloc];
    }


    NSLog(@"other table : %@", workoutListForTable);
    [workoutListForTable retain];
}

Ответы [ 2 ]

3 голосов
/ 07 июля 2011

В этой строке:

passedWorkout = [[NSArray alloc] init];

Вы создаете неизменный массив, в котором ничего нет.Что вы хотите, чтобы он содержал?

1 голос
/ 07 июля 2011

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

[self fetchWorkoutList]

Вы сбрасываете его здесь каждый раз:

[workoutListView passWorkoutBack:[workoutListForTable objectAtIndex:indexPath.row]];

В качестве примечания здесь:

-(void)passWorkoutBack:(NSArray *)workout{
    passedWorkout = workout;
    [passedWorkout retain];
}

У вас уже есть свойство passWorkout, которое сохраняется, однако вам нужно вызвать его на себя

-(void)passWorkoutBack:(NSArray *)workout{
    self.passedWorkout = workout;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...