2011-12-09 55 views
1

我对iOS平台相当陌生,并且在内存管理方面遇到了一些问题。我通过一个自定义的UIViewController类的初始化程序传入一个对象(试用版),当UIViewController最终收到它时,该对象为零。我希望有人能够指引我走向正确的方向。我已经在下面列出了一些源代码。iOS初始化参数为零

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 
的定义
+0

你可以发布TrialDetailController的init-Method的代码吗? – samsam

+0

你明白了。我刚刚发布了它。 – Hopdizzle

+0

你试过调试过吗?您可以在gdb调试器(控制台窗口)中设置断点并查看变量/属性值。请参阅[XCode4中的Objective-C调试技巧?](http://stackoverflow.com/a/7650979/590956)。只是想知道'po dataArray'会在调试器中显示什么。你在哪里添加值到这个数组中,并且在你尝试向它添加对象之前初始化数组? – Sam

回答

0

你不应该在init方法中使用self.trial。做那trial = [inTrial retain];

然后,您不应该在TrialDetailController.h中导入Trial.h,在TrialDetailController.m中执行该操作。在TrialDetailController.h中的@interface行之上放置一个@class Trial;(一个前向定义)。

+0

为什么不在init中使用self.trial?如果你有保留财产,你永远不应该使用保留/释放ouside的getter或setter。这就是为什么保留物业在那里! – Sulthan

+0

请参阅http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html段落'不要在初始化方法和dealloc中使用访问器方法。 –

+0

Init和dealloc方法的行为与任何其他方法的行为完全相同。为什么不在init/dealloc中调用它们通常是因为你的设置器在引用另一个尚未分配的属性或已经释放的属性时行为不正确。但请注意,当您不使用setter时可能会出现同样的问题。这一切都取决于你的setter的内容,使用保留/释放不会使它更好。无论如何,你必须考虑释放属性的顺序。 – Sulthan

0

我的猜测是,当你的代码做 Trial *trial = (Trial *)[dataArray objectAtIndex:indexPath.row];

变量dataArray是零。那么trial也是零。

[trial release];不应该在那里,因为从善如流是建议。

我找不到任何其他问题。

只有您不必在界面中声明属性变量: Trial *trial。合成时会自动创建一个变量(我希望你在某处有@synthesize trial;)。