代码之家  ›  专栏  ›  技术社区  ›  rtemp

目的用非葡萄球菌治疗非葡萄球菌性肌腱渗漏

  •  2
  • rtemp  · 技术社区  · 17 年前

    我正在清理电话簿iPhone应用程序中的代码,仪器中的泄漏工具报告说我正在泄漏nscfstring对象。以下是我所遵循的模式:

    我的应用程序中有一个Person类,它只包含本地nsstring成员以及名、姓等的关联属性。

    我的视图控制器有一个nsmutableArray属性,该属性由SearchBarSearchButtonClicked事件中的sqlite数据库填充。此nsmutableArray由将用于填充我的TableView控件的Person对象填充。此外,如果用户单击视图中的某个人,则其个人对象将传递到详细信息视图,以查看除名称之外的其他信息。

    当我执行第一次查找并显示结果时,没有内存泄漏。

    现在,当我执行第二次查找时,理想情况下我希望清除NSmutableArray并用新的结果集重新加载它,而不泄漏内存。为此,我在PersonalList属性上调用removeAllObjects,然后调用数据库重新填充PersonalList nsmutableArray,如下所示:

    [self.personList removeAllObjects];
    self.personList = [SearchService GetPersonList:searchText];
    [list reloadData];
    

    通过调用removeallobject,我已经消除了以前与Person对象相关联的泄漏。但是,现在看来我正在泄漏从个人对象的属性中遗留下来的nsstring对象。

    这有可能吗?

    我对Instruments工具不熟悉,但从钻取NCSFstring泄漏的扩展细节可以看出,堆栈中的最后一行代码通常指向属性的@Synthesis代码行,例如:

    @synthesize firstName;
    

    所以,这就是为什么我认为这些nsstring没有得到清理。有没有更好的方法可以做到这一点而不产生内存泄漏?

    1 回复  |  直到 17 年前
        1
  •  3
  •   Alex Rozanski    16 年前

    你释放 NSString S在 dealloc 个人类的方法?

    假设您将您的财产设置为这样:

    @property (retain) NSString *firstName;
    

    当你设置 firstName 使用setter,它将被保留。如果 Person 然后释放并释放实例,但 第一名字 还没有释放它就会泄漏。

    把它放进 释放内存 你的方法 班级:

    - (void)dealloc
    {
        [firstName release];
        [super dealloc];
    }
    

    (假设您的 第一名字 属性被调用 第一名字 )