0

私はUISwitchsとUITextFieldsでこれをやっています...

クラス内のいくつかの異なるメソッドでその値にアクセスしたいので、ヘッダー ファイルで UISwitch を Property として宣言しました。

次のコードを使用して、UISwitch を TableViewCells の 1 つに追加しています。

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

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
cell.accessoryView = mySwitch;
mySwitch.on = YES;

return cell;

} 

そのままで、retainCounts はいたるところにあります。mySwitch Retain は、セルが画面に配置されるまでに 2 であり、スイッチをタップするたびに保持カウントが増加し、4 になるまで保持されているように見えます。

明らかに私は何かが欠けています。誰かが私を正しい方向に向けることができれば、それは大歓迎です。

4

2 に答える 2

1

オブジェクトのretainCountを追跡することは、プライベートAPIがオブジェクトと対話しているときに実行したいことではありません。自分の保持カウントを追跡し、必要に応じてそれをインクリメントおよびデクリメントしていることを確認するだけです。あなたが次のようなものを持っていると仮定します:

@property (nonatomic, retain) UISwitch *mySwitch;

@synthesize mySwitch;

上記のコードを次のように変更する必要があります。

self.mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
cell.accessoryView = mySwitch;
mySwitch.on = YES;

上記のコードでは、自動リリースするように指示したように、mySwitchを所有していません。ただし、を使用self.mySwitchすることにより、そこで作成するときにプロパティを保持できます。その後、プログラムの残りの部分で必要に応じて使用できます。必ずdeallocで安全にリリースしてください。

于 2010-10-16T22:52:06.193 に答える
0

1:決して、retainCountによって返されるものに注意を払うことはありません。人間が解釈できる値を意味するものではありません。

2:ビルドと分析を実行してみてください。このような多くのメモリの問題を見つけて、何が悪いのかを説明することができます。

3:allocを呼び出すたびに、一致するリリース(または自動リリース)が必要です。この場合、の[mySwitch release]後に呼び出すことができますmySwitch.on = YES

4:Objective-Cのメモリ管理ルールを定期的に確認することは有益です。http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html

于 2010-10-16T22:54:38.360 に答える