2011-12-09 10 views
1

私はiOSプラットフォームが新しく、メモリ管理にいくつか問題があります。カスタムUIViewControllerクラスのイニシャライザを使ってオブジェクト(試し版)を渡しています。UIViewControllerが最終的にそれを受け取ったとき、オブジェクトはnilです。誰かが私を正しい方向に向けることを望んでいました。私は以下のソースコードをいくつか含めました。iOS初期化パラメータが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 
の定義があります
+0

TrialDetailControllerのinit-Methodのコードを投稿することはできますか? – samsam

+0

あなたはそれを持っています。私はちょうどそれを投稿した。 – Hopdizzle

+0

これをデバッグしようとしましたか?ブレークポイントを設定し、変数/プロパティ値をgdbデバッガ(コンソールウィンドウ)で表示することができます。 [Objective-C Debuging Tips in XCode4?](http://stackoverflow.com/a/7650979/590956)を参照してください。デバッガで 'po dataArray'が何を表示するのか不思議です。この配列にはどこに値を追加しますか?オブジェクトを追加する前に配列を初期化しますか? – Sam

答えて

0

init-methodでself.trialを使用しないでください。それをtrial = [inTrial retain];にする。

次に、TrialDetailController.hでTrial.hをインポートする必要はありません.TrialDetailController.hでインポートする必要があります。 TrialDetailController.hの@interface行の上に@class Trial;(フォワード定義)を置きます。

+0

initでself.trialを使用しないのはなぜですか?プロパティを保持している場合は、getterまたはsetterを保持/解放しないでください。だからこそ、財産がそこにあるのです! – Sulthan

+0

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.htmlの段落「初期化メソッドとアクセラレータでアクセッサメソッドを使用しないでください」を参照してください。 –

+0

Initメソッドとdeallocメソッドは他のメソッドとまったく同じように動作します。 init/deallocでそれらを呼び出さない理由は、通常、まだ割り当てられていない、またはすでに割り当てが解除されている別のプロパティを参照するときに、setterが正しく動作しないという事実から来ます。しかし、setterを使用していないときにも同じ問題が発生することに注意してください。それはすべてあなたのセッターの内容に依存し、retain/releaseを使用してもそれが改善されるわけではありません。とにかく、プロパティをリリースする順序について考える必要があります。 – Sulthan

0

私の推測では、あなたのコードが Trial *trial = (Trial *)[dataArray objectAtIndex:indexPath.row];

を行い、変数dataArrayがnilであるということです。そうすれば、trialもゼロになります。

[trial release];は、善意如流が示唆しているとおりにはいけません。

他に問題が見つかりません。

インターフェイスでプロパティ変数: Trial *trialを宣言する必要はありません。合成時に変数が自動的に作成されます(私はあなたがどこかに@synthesize trial;を持っていることを期待しています)。

関連する問題