Ios NSDecimalNumberPlaceHolder泄漏

Ios NSDecimalNumberPlaceHolder泄漏,ios,ipad,memory-leaks,instruments,nsdecimalnumber,Ios,Ipad,Memory Leaks,Instruments,Nsdecimalnumber,我有一个iPad应用程序,在测试前我正在仪器中测试。我已经排除了所有的内存泄漏,除了一个,我找不到任何关于它的信息。我不知道该怎么办,因为我的代码从来没有提到泄漏的对象,它是NSDecimalNumberPlaceHolder的一个实例 当然,我使用的是NSDecimalNumber。我为每个用户操作创建2个小数,每次我运行应用程序的一个周期(对两个NSDecimalNumber执行一些数学运算),我都会生成这个NSDecimalPlaceHolder的四个实例。由于我不知道它是如何创建的,我不

我有一个iPad应用程序,在测试前我正在仪器中测试。我已经排除了所有的内存泄漏,除了一个,我找不到任何关于它的信息。我不知道该怎么办,因为我的代码从来没有提到泄漏的对象,它是NSDecimalNumberPlaceHolder的一个实例

当然,我使用的是NSDecimalNumber。我为每个用户操作创建2个小数,每次我运行应用程序的一个周期(对两个NSDecimalNumber执行一些数学运算),我都会生成这个NSDecimalPlaceHolder的四个实例。由于我不知道它是如何创建的,我不知道如何释放或解除锁定它,以避免一次又一次地产生这16个字节的泄漏

这些可能不是真正的泄漏吗

我已经运行了XCode分析器,它没有报告任何问题

我现在做的是:

我将一个十进制数从我的控制器发送到我的模型(analyzer),该模型执行操作并返回结果

[[self analyzer_] setOperand:[NSDecimalNumber decimalNumberWithString:anotherStringValue]];
SetOperator方法如下所示:

-(void)setOperand:(NSDecimalNumber*)theOperand
{
NSLog(@"setOperand called");
operand_ = theOperand;
//[operand_ retain];    
}

请注意,如果我没有保留操作数“某处”,我会遇到错误的访问崩溃。我目前保留它,稍后在操作数和之前提供的操作数(queuedOperand_389;)的操作中释放它。例如:

{
[self performQueuedOperation];
queuedOperation_ = operation;
queuedOperand_ = operand_;
}   

return operand_;
[operand_ release];
其中performquedOperation为:

-(void)performQueuedOperation
{
   [operand_ retain];
   if ([@"+" isEqualToString:queuedOperation_]) 
   {
    @try
    {
    operand_ = [queuedOperand_ decimalNumberByAdding:operand_];
    }
    @catch (NSException *NSDecimalNumberOverFlowException)
    {
    //viewController will send decimal point error message
    }
   <etc for the other operations>
}
-(无效)执行UED操作
{
[操作数保留];
if([@“+”isEqualToString:QueueDoOperation_3;])
{
@试一试
{
操作数\=[queuedOperand \-decimalNumberByAdding:操作数\];
}
@捕获(NSException*NSDecimalNumberOverFlowException)
{
//viewController将发送小数点错误消息
}
}

如果不清楚,请告诉我。谢谢。

尝试使用Heapshot仪器,请参阅:


如果仍然有一个指向不再使用的内存的指针,这不是泄漏,而是内存丢失。我经常使用Heapshot,它确实非常有效。还可以在分配工具中打开记录引用计数并向下钻取。下面是一个屏幕截图:

在Instruments中尝试Heapshot,请参阅:


如果仍然有一个指向不再使用的内存的指针,这不是泄漏,而是内存丢失。我经常使用Heapshot,它确实非常有效。还可以在分配工具中打开记录引用计数并向下钻取。下面是一个屏幕截图:

NSDecimalNumberPlaceHolder可能是在n您使用的是NSDecimalNumber。请尝试发布一些代码以查看。另外,当您对代码运行分析器时会发生什么情况?感谢您的快速回复@ThomasW。我编辑了问题以提供所需的信息。我认为您必须在充分了解保留/释放应如何工作的情况下清理代码。setOperator:method shouLD可能保留操作数的新值并释放旧值。如果在SETER中不需要做任何特殊的操作,则应该考虑将操作数更改为保留的@属性。保留和释放的其他用途应该被清除。'代码不会释放操作数,因为返回将退出该方法。(编译器应该为此发出警告。)感谢提示。没有警告。我已经尝试了两种方法(使用和不使用@property以及在setter中使用和不使用retain和release)。我将在返回后清理这些实例。尝试在SetOperator方法中释放并保留它,最终会从我的应用程序中得到2个未释放的NSDecimalNumber实例(我不知道为什么)占位符是由基金会生成的。虽然我有一些想法。当我尝试过的时候,我会报告。一定要在你的DELOLC方法中释放操作数。NSDECIMIALNULBYBULKSTORKER可能是在使用NSDECIMALALNATIONE时分配的具体类。试着张贴一些代码来查看。代码上的分析器?感谢@ThomasW的快速回复。我编辑了这个问题以提供所需的信息。我认为您必须在充分了解保留/释放应如何工作的情况下清理代码。SetOperator:方法可能应该保留操作数的新值并释放旧值。如果您不需要要在SETER中做任何特殊的操作,您应该考虑将操作数更改为具有保留的@属性。保留和释放的其他用途应该被清除。“返回操作数;[操作数释放];”代码将不会释放操作数,因为返回将退出该方法。(编译器应该为此发出警告。)谢谢你的提示。没有警告。我已经尝试了两种方法(有@property和没有@property,还有setter中的retain和release)。我将在返回后清理这些方法。尝试在setoperator方法中释放和保留它,最终会从我的应用程序中给我两个未发布的NSDecimalNumber实例(我不知道为什么)占位符是由基金会生成的。虽然我有一些想法。当我尝试过的时候,我会报告的。一定要用你的DEROLC方法释放操作数。谢谢你的帮助。我不是一个仪器专家,但是我不知道HoopScript是如何帮助隔离这个问题的。虽然我总是放弃服务器,但我确实通过引用计数看到了。我的NSDecinal的所有实例的计数为1,这似乎是由我的performOperation方法(调用performquedoOperation)引起的。但是,我无法再删除一个[operand_retain],因为如果我的应用程序崩溃,因为它最终尝试访问已解除分配的queuedOperand_uu实例。我的整个模型控制器设计可能有缺陷。你的问题不是唯一的,我经常看到。是的,这是一个设计问题,可能没有简单的解决方案。那么,你关心泄漏吗?足够了吗记忆在你的应用程序的生命中泄露了吗?要考虑整个生命,包括它在后台。如果你的应用程序可以忍受泄露,实用主义常常是WI。