Параметр инициализатора iOS равен нулю - PullRequest
1 голос
/ 09 декабря 2011

Я довольно новичок в платформе iOS и у меня возникли некоторые проблемы с управлением памятью. Я передаю объект (пробную версию) через инициализатор пользовательского класса UIViewController, и когда UIViewController, наконец, получает его, объект имеет значение nil. Я надеялся, что кто-то может указать мне правильное направление. Я включил часть исходного кода ниже.

Trial.h

@interface Trial : NSObject {

    NSString *IRBNumber;
    NSString *PI;
    NSString *Sponsor;
    NSString *ContactName;
    NSString *ContactPhone;
    NSString *ContactEmail;
    NSString *Location;
    NSString *Objective;
    NSString *Eligibility;
    NSString *Name;
    NSString *DiseaseGroup;
    NSString *Age;
}

@property (retain, nonatomic) NSString *IRBNumber;
@property (retain, nonatomic) NSString *PI;
@property (retain, nonatomic) NSString *Sponsor;
@property (retain, nonatomic) NSString *ContactName;
@property (retain, nonatomic) NSString *ContactEmail;
@property (retain, nonatomic) NSString *ContactPhone;
@property (retain, nonatomic) NSString *Location;
@property (retain, nonatomic) NSString *Objective;
@property (retain, nonatomic) NSString *Eligibility;
@property (retain, nonatomic) NSString *Name;
@property (retain, nonatomic) NSString *DiseaseGroup;
@property (retain, nonatomic) NSString *Age;

@end

DiseaseControllersViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    Trial *trial = (Trial *)[dataArray objectAtIndex:indexPath.row];
    TrialDetailController *detailViewController = [[TrialDetailController alloc] initWithNibNameAndTrial:@"TrialDetailController" bundle:nil trial:trial];

    [self.navigationController pushViewController:detailViewController animated:YES];

    [detailViewController release];
    [trial release];
}

Вот определение инициализатора

-(id)initWithNibNameAndTrial: (NSString*)NibNameOrNil bundle:(NSBundle*)nibBundlerOrNil trial:(Trial *)inTrial {
    self = [super initWithNibName:NibNameOrNil bundle:nibBundlerOrNil];
    if(self) {
        self.trial = inTrial;
    }
    return self;
}

TrialDetailController.h

#import "Trial.h"

@interface TrialDetailController : UITabBarController {

    Trial *trial;

}

@property (nonatomic, retain) Trial *trial;

-(id)initWithNibNameAndTrial: (NSString*)NibNameOrNil bundle:(NSBundle*)nibBundlerOrNil trial:(Trial *)inTrial;
-(IBAction)objectiveTabItemClick:(id)sender;
-(IBAction)detailsTabItemClick:(id)sender;

@end

Ответы [ 2 ]

0 голосов
/ 10 декабря 2011

Я думаю, что когда ваш код делает Trial *trial = (Trial *)[dataArray objectAtIndex:indexPath.row];

переменная dataArray равна нулю. Тогда trial также будет равно нулю.

[trial release]; не должно быть там, как предлагает 从善如流.

Я не могу найти другую проблему.

Только вам не нужно объявлять переменную свойства: Trial *trial в вашем интерфейсе. Переменная создается автоматически при синтезе (я ожидаю, что у вас есть @synthesize trial; где-то).

0 голосов
/ 10 декабря 2011

Вы не должны использовать self.trial в init-методе.Сделайте это trial = [inTrial retain];.

Тогда вам не следует импортировать Trial.h в TrialDetailController.h, делайте это в TrialDetailController.m.Поместите @class Trial; (прямое определение) над строкой @interface в TrialDetailController.h.

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