【问题标题】:Adding @Property UISwitch to TableView Causes RetainCount Problems将@Property UISwitch 添加到 TableView 会导致 RetainCount 问题
【发布时间】:2011-04-26 10:52:51
【问题描述】:

我正在使用 UISwitchs 和 UITextFields...

我已在头文件中将 UISwitch 声明为属性,因为我想在我的类中通过几种不同的方法访问它的值。

我正在使用以下代码将 UISwitch 添加到我的 TableViewCell 之一:

- (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,然后它似乎会停留在那里。

显然我错过了一些东西。如果有人能指出我正确的方向,将不胜感激。

【问题讨论】:

    标签: iphone uitextfield retain uiswitch retaincount


    【解决方案1】:

    当私有 api 与对象交互时,您不想执行对象的 retainCount。您要做的就是跟踪您自己的保留计数,然后确保您正在增加它并根据需要减少它。假设您有以下内容:

    @property (nonatomic, retain) UISwitch *mySwitch;
    
    @synthesize mySwitch;
    

    您应该将上面的代码更改为:

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

    在您上面的代码中,您不再拥有 mySwitch,因为您告诉它自动释放。但是,通过使用self.mySwitch,当您在那里创建该属性时,您将保留该属性。然后,您可以在程序的其余部分中随意使用它。只需确保在 dealloc 中安全地释放它即可。

    【讨论】:

    • 显然我不了解“自我”的正确用法,我将不得不对这个主题进行一些阅读。
    • 是的,这是objective-c在使用属性时非常重要的一部分。基本上,如果不使用 self,则不会使用合成的 getter 或 setter。您将直接访问指针。
    【解决方案2】:

    1:永远,永远,永远不要关注retainCount返回的内容。它不是人类可解释的值。

    2:尝试运行构建和分析。它可以找到很多内存问题,比如这个,并说明问题所在。

    3:每次调用 alloc 时,都需要一个匹配的释放(或自动释放)。在这种情况下,您可以在mySwitch.on = YES 之后调用[mySwitch release]

    4:定期检查 Objective-C 的内存管理规则是值得的。 http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多