ios - 在 for 循环中使用日期格式化程序的 dateFromString api 会产生巨大的内存问题
<p><p>我在 for 循环之外创建了一个 <code>NSDateFormatter</code> 的实例(或者可以说是一个实例变量),然后在 for 循环中将其用作 <code></code>。这给了我巨大的内存问题。我尝试使用 <code>@autorelease</code> 指令降低巨大的内存分配,其中我已将 for 循环移动到 autoreleaseblock 。我还在自动释放 block 之外将 dateFormatter 实例设置为 nil 。由于 for 循环中的 dateFormatter,正在寻找一种更好的方法来降低内存消耗。</p>
<pre><code>-(void)start {
NSTimer *timer = ;
}
-(void)refresh
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
// Code for Fetching data from server and parsing it
CustomObject *obj = ;
});
}
@implementation Parser
+(CustomObject *)parseData:(NSDictionary *) dictioanry {
NSArray *array;
array = ;
NSDateFormatter *df = [ init];
;
@autoreleasepool
{
for ( NSDictionary *dic in array)
{
NSDate *date = ];
nestedObj.startTime = date;
// construct and store the custom Objects
// add the nested objects to an array
;
date = nil;
}
}
df = nil;
return obj;
}
@end
</code></pre></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>你的 <code>@autoreleasepool</code> 放错地方了。您需要在每个循环结束时排空池:</p>
<pre><code> for ( NSDictionary *dic in array)
{
@autoreleasepool {
NSDate *date = ];
obj.nestedObj.startTime = date;
date = nil;
}
}
</code></pre>
<p>也就是说,我假设您的真实代码有很大不同。这段代码没有任何意义。您一遍又一遍地覆盖相同的 <code>obj.nestedObj.startTime</code> 。只有最后一个循环迭代才是重要的。但也许这是您创建示例时的转录错误。</p>
<p>请注意,没有理由像这样到处使用 <code>x = nil</code>。这会自动发生,您通常应该允许它这样做。</p>
<hr/>
<p>编辑:</p>
<p>只是在评论中触及@trojanfoe 的问题(这里没有什么重要的,这只是一个有趣的问题)。我们可以稍微探索一下 Foundation,看看它在做什么。几经周折之后,对 <code>dateFromString:</code> 的调用最终以一个名为 <code>_getObjectValue:</code> 的方法结束,最终在 OS X 版本中执行如下操作:</p>
<pre><code>...
NSDate *date = (NSDate *)CFDateFormatterCreateDateFromString(NULL, (CFTypeRef)self, ...);
if (date != nil) { CFMakeCollectable((CFTypeRef)date); }
;
...
</code></pre>
<p>考虑到 <code>getObjectValue:forString:range:error:</code> 是最通用的形式,并且它是唯一的 <code>dateFromString</code> 引用,我们可以在不深入汇编的情况下直觉这一点,所以一切都可能成为瓶颈(这实际上是真的)。这种方法的 Swift 解释可以让您了解它可能会在某处自动释放:</p>
<pre><code>func getObjectValue(_ obj: AutoreleasingUnsafePointer<AnyObject?>, forString string: String!, range rangep: UnsafePointer<NSRange>, error error: NSErrorPointer) -> Bool
</code></pre>
<p>当然,在实践中,您几乎从来没有认真考虑过这个问题 :D 您应该假设您调用的任何 Cocoa 方法都可能生成自动释放的对象,并相应地执行。即使您可以证明它在特定版本的 Cocoa 中没有,Apple 也可以在未来的版本中自由更改,因此您应该始终期待它们。</p></p>
<p style="font-size: 20px;">关于ios - 在 for 循环中使用日期格式化程序的 dateFromString api 会产生巨大的内存问题,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/28957796/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/28957796/
</a>
</p>
页:
[1]