1

iPhoneアプリケーションで作業します。ここでは、グローバルとして定義され、UITableViewControllerのViewDidLoadで初期化されたクラスインスタンスがあります。目的CクラスインスタンスのプロパティがUITableViewControllerで割り当て解除される

cellForRowAtIndexPathに到達すると、インスタンスプロパティは割り当て解除され、デバッガと同じように表示されます。

プロパティはデータベースからロードされています。

foo.hという

NSString *prop1; 

@property(nonatomic, retain)NSString *prop1; 
-(void)shouldLoadProperties; 

Foo.m

@synthesize prop1; 

-(void)shouldLoadProperties { 
    <FMDatabase stuff here> 

    FMResultSet *rs = [self executeQuery:sql]; 
    prop1 = [rs stringForColumn:@"col1"]; //loads db value "Test" into prop1 
} 

テーブルビューコントローラ:

TestTableViewController.h

Foo *foo; 

TestTableViewController.m

-(void)viewDidLoad { 
    foo = [[[Foo alloc] init] retain]; 
    [foo shouldLoadProperties]; 

    //Breakpoint here shows that foo.prop1 is set to "Test" 

} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    //foo is is still allocated, but foo.prop1 has been 
    //deallocated; shows as <freed object> 

    NSLog(@"Prop 1 is %@", foo.prop1); //throws exception 


} 

私はFOOを解放していないよ、なぜプロパティは、自分自身を解放しますか?インスタンスが解放されるまで、Fooでプロパティにハングアップする何かが欠けていますか?

UPDATEは

私が発見したデータベースからプロパティを取り込むときのデータが保持していることを、保持して追加することにより:

prop1 = [[rs stringForColumn:@"col1"] retain]; 

が、これは正しいですか、私は他の何かが足りないのですか?

答えて

1

ここでの問題は、prop1をプロパティとして使用せず、クラス内の変数として使用することです。あなたはこれらの異なる名前を付けることができます。これは、変数名の先頭に下線を置くのが通例です:

がfoo.h

NSString *_prop1; 

@property(nonatomic, retain)NSString *prop1; 
-(void)shouldLoadProperties; 

foo.m今

@synthesize prop1 = _prop1; 

、実際にあなたのプロパティを使用するには、ゲッターとセッターを使用してください。これにより、あなたの価値が保持され、必要に応じてリリースされます。

[self setProp1:[rs stringForColumn:@"col1"]]; //loads db value "Test" into prop1 

self.prop1 = [rs stringForColumn:@"col1"]; //loads db value "Test" into prop1 

有効および互いに等価の両方です。

_prop1 = [rs stringForColumn:@"col1"]; //loads db value "Test" into prop1 

クラッシュなどの動作不良につながります。

このアップデートではクラッシュを防ぐことができますが、複数回行うとメモリがリークします。

+0

優れています。レスポンスありがとう! – jfuhr

関連する問題