Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone CoreFoundation框架导致内存泄漏_Iphone_Xcode_Iphone Sdk 3.0_Ios4 - Fatal编程技术网

Iphone CoreFoundation框架导致内存泄漏

Iphone CoreFoundation框架导致内存泄漏,iphone,xcode,iphone-sdk-3.0,ios4,Iphone,Xcode,Iphone Sdk 3.0,Ios4,我正在开发一个iPhone应用程序,它主要利用地址簿和数据库。在从通讯录中取出大约3000个联系人后,我将字符串标记附加到联系人上(每个联系人5个)。我正在数据库中保存我的标签 出于负载测试的目的,我在应用程序中添加了10000个标签。但是在我的应用程序的负载测试期间,我观察到一些与应用程序代码无关但代表一组指令集的内存泄漏。也有仪器作为泄漏负责库(广泛使用 NSCORS/, NSCORCHOR> , NSArray 属于基础框架。我的应用程序在使用10-15分钟后崩溃。崩溃报告提到,应用程序由

我正在开发一个iPhone应用程序,它主要利用地址簿和数据库。在从通讯录中取出大约3000个联系人后,我将字符串标记附加到联系人上(每个联系人5个)。我正在数据库中保存我的标签

出于负载测试的目的,我在应用程序中添加了10000个标签。但是在我的应用程序的负载测试期间,我观察到一些与应用程序代码无关但代表一组指令集的内存泄漏。也有仪器作为泄漏负责库(广泛使用<代码> NSCORS/<代码>,<代码> NSCORCHOR> ,<代码> NSArray <代码>属于基础框架。我的应用程序在使用10-15分钟后崩溃。崩溃报告提到,应用程序由于内存不足而崩溃

使用CLANG的内存分析显示零泄漏。如何解决这些内存泄漏?
这些泄密是这次坠机事件的真正罪魁祸首吗?是否有其他工具可用于检查内存泄漏?

尝试在u代码中解决一些问题: 1.请避免像这样隐藏声明

NSString *string = [dictionary valueForKey:[dictionary2 valueForKey:@"something"]]
正确的代码是:

NSString *key = [dictionary2 valueForKey:@"something"];  
NSString *string = [dictionary valueForKey:key];
key = nil;
  • 尽量避免使用自动释放和本地声明进行声明,如:

    NSArray*数组=[NSArray数组]

  • 如果您这样做,请确保您有:

    NSArray *array = [NSArray array];
    .... some code where array is using;
    array = nil;
    
    更好的办法是alloc,当你们不需要对象时立即释放,并将其置为零。 3.检查您是否使用了正确的设置器。根据我的经验,可能更好的办法是避免使用它,为getter和setter释放类开始泄漏,这是以前使用过的


    如果你发布了你代码的某个部分,在那里你看到了大多数的泄漏(工具让你有可能点击泄漏的对象,并查看编程代码中的泄漏量),社区可以提供更多建议

    clang不是检漏员。它只检测一小部分问题

    对于内存泄漏调试,您应该关注工具,特别是对象分配和泄漏工具。不过,请务必理解泄漏和其他高内存使用率源之间的区别

    一旦确定对象正在泄漏,请使用工具检查它们的分配堆栈跟踪(以便您可以知道它是什么对象)及其保留/释放历史


    如果不是泄漏,我建议调查以下说明:http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/我经常发现我的漏洞是由核心基金(或其他任何框架)造成的,但实际上是我自己的。除了模拟器之外,很少会在框架中发现过多的泄漏

    如果打开Instruments中右侧的详细信息面板,您可能会发现其中列出了应用程序的方法。这将在代码中为您指明它可能来自何处。一个漏洞可能引发许多其他漏洞,您可能必须找到顶层的罪犯以消除底层的漏洞


    你不应该期望Clang做任何事情,而是找到最明显的漏洞。它非常方便,但仅此而已,只是对编译的有益补充

    > P>最有可能的是创建基础对象的代码。Leaks向您显示分配的位置,但这通常是由于您的代码为创建对象而进行的调用。您可以查看Instruments中的调用链,然后沿着调用链返回,直到找到您的代码-这就是导致分配的地方。现在,对于该分配,请查看该对象的内存处理:您是否在稍后释放它

    有很多方法可以使您无法释放内存属性,因此很难猜测您可能遇到了哪种方法。我在帮助人们时看到的方法包括分配一个对象,并通过带有retain属性的属性将其分配给实例变量,如下所示:

    @属性(保留)NSString*myString

    self.myString=[[NSString alloc]initWithString:@“foo”]

    alloc+init创建一个保留对象,self.myString=再次增加保留计数。如果编码正确,dealloc方法将通过以下方式之一释放属性:

    [myString发布]; 或 self.myString=nil

    这会处理添加了self.myString=的retain,但不会处理创建时的retain。解决方案,以下其中一种:

    myString=[[NSString alloc]initWithString:@“foo”];//不调用setter方法,因此不保留赋值-但不调用setter,如果setter不是平凡的setter,那么这可能是不好的

    self.myString=[[NSString alloc]initWithString:@“foo”]autorelease]

    自动释放释放释放alloc+init retain

    当然,这是一个人为的例子,因为您可能真的会使用:

    self.myString=[nsstringwithstring:@“foo”]

    这是一个返回自动释放字符串的类方法,可以避免此问题。但我们的想法是用一个简单的例子来解释这类问题


    有许多其他方法无法正确释放内存,但在找到代码之前,建议您以自己的方式备份调用链,这样可以查看触发内存分配的位置,然后您就可以找出无法正确释放内存的原因。

    这可能是一个自动释放问题。如果你分批做,还会发生这种情况吗?也就是说,在运行循环的不同i创建中?可能会用自己的池来结束操作。是的,我尝试在应用程序收到内存警告后排空自动释放池,但排空池也没有好处。你应该知道泄漏是否是罪魁祸首,仪器显示你泄漏了多少内存?仪器显示高达25 MB的活动字节,然后崩溃,有时,它在仅12 MB的活动字节后崩溃。这是否明确是泄漏?或者更确切地说是分配问题(例如,您使用了太多内存)?是的,我已经解决了所有问题