__NSAutoreleaseNoPool(): ... utoreleased with no pool in place - just leaking

我的平台

mac os 10.6
Xcode 3.2.6

编译时出的问题

  1. 2013-12-02 21:52:33.177 UniworkC[1662:4307] *** __NSAutoreleaseNoPool(): Object 0x134830 of class __NSCFDate autoreleased with no pool in place - just leaking
  2. 2013-12-02 21:52:33.178 UniworkC[1662:4307] *** __NSAutoreleaseNoPool(): Object 0x113900 of class NSCFNumber autoreleased with no pool in place - just leaking
  3. 2013-12-02 21:52:33.179 UniworkC[1662:4307] *** __NSAutoreleaseNoPool(): Object 0x10f590 of class NSCFLocale autoreleased with no pool in place - just leaking
  4. 2013-12-02 21:52:33.180 UniworkC[1662:4307] *** __NSAutoreleaseNoPool(): Object 0x30a4 of class NSCFString autoreleased

原来的代码

  1. void savePNGImage(CGImageRef imageRef, NSString *path)
  2. {
  3. NSURL *fileURL = [NSURL fileURLWithPath:path];
  4. CGImageDestinationRef dr = CGImageDestinationCreateWithURL(( CFURLRef)fileURL, kUTTypePNG , 1, NULL);
  5. CGImageDestinationAddImage(dr, imageRef, NULL);
  6. CGImageDestinationFinalize(dr);
  7. CFRelease(dr);
  8. }
  9. void save()
  10. {
  11. CGDirectDisplayID displayID = CGMainDisplayID();
  12. CGImageRef imageRef = CGDisplayCreateImage(displayID);
  13. NSDate* now = [NSDate date];
  14. NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
  15. fmt.dateFormat = @"yyMMddHHmmss";
  16. //fmt.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
  17. NSString* dateString = [fmt stringFromDate:now];
  18. NSString *path = [[NSString stringWithFormat:@"~/Desktop/tmp/%@.png", dateString ] stringByExpandingTildeInPath];
  19. NSLog(@"save file: %@", path);
  20. savePNGImage(imageRef, path);
  21. CFRelease(imageRef);
  22. }
  23. void *screenCaputureFunc( void *para)
  24. {
  25. for(int i=0; i< 10; i++){
  26. sleep(10);
  27. save();
  28. }
  29. printf("end of capture\n");
  30. return (void *)0;
  31. }

更改为

  1. void savePNGImage(CGImageRef imageRef, NSString *path)
  2. {
  3. // references: http://stackoverflow.com/questions/8225838/save-cgimageref-to-png-file-errors-arc-caused
  4. NSURL *fileURL = [NSURL fileURLWithPath:path];
  5. CGImageDestinationRef dr = CGImageDestinationCreateWithURL(( CFURLRef)fileURL, kUTTypePNG , 1, NULL);
  6. CGImageDestinationAddImage(dr, imageRef, NULL);
  7. CGImageDestinationFinalize(dr);
  8. //CFRelease(dr);
  9. }
  10. void save()
  11. {
  12. // references: http://stackoverflow.com/questions/8225838/save-cgimageref-to-png-file-errors-arc-caused
  13. CGDirectDisplayID displayID = CGMainDisplayID();
  14. CGImageRef imageRef = CGDisplayCreateImage(displayID);
  15. NSDate* now = [NSDate date];
  16. NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
  17. fmt.dateFormat = @"yyMMddHHmmss";
  18. //fmt.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
  19. NSString* dateString = [fmt stringFromDate:now];
  20. NSString *path = [[NSString stringWithFormat:@"~/Desktop/tmp/%@.png", dateString ] stringByExpandingTildeInPath];
  21. NSLog(@"save file: %@", path);
  22. savePNGImage(imageRef, path);
  23. //CFRelease(imageRef);
  24. }
  25. void *screenCaputureFunc( void *para)
  26. {
  27. for(int i=0; i< 10; i++){
  28. sleep(10);
  29. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  30. save();
  31. [pool release];
  32. }
  33. printf("end of capture\n");
  34. return (void *)0;
  35. }

增加的自动释放的内存池。
参考

  1. The error you get is caused by something somewhere creating an Objective-C class (NSURL) using the convenience static method [NSURL urlWithString:]. Methods that return objects that aren‘t "alloc" or "copy" should put the object inside an autorelease pool before returning the object. And since you haven‘t setup one up it‘ll just crash or leak memory.
  2. I‘m not sure exactly how to fix this but you need to put something like:
  3. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  4. doStuff();
  5. [pool release];
  6. somewhere in your code.

刚刚做MAC的开发,不能给出什么更深层次的解释,只是得到这么个心得:
有不能控制内存的代码,放在自动释放的内存池中。
以后再做解释吧

参考
http://stackoverflow.com/questions/2557562/using-apple-autorelease-pools-without-objective-c

时间: 2024-10-07 13:19:35

__NSAutoreleaseNoPool(): ... utoreleased with no pool in place - just leaking的相关文章

C语言中内存的管理

一  Handler作用和概念 包含线程队列和消息队列,实现异步的消息处理机制,跟web开发的ajax有异曲同工之妙. 1.运行在某个线程上,共享线程的消息队列: 2.接收消息.调度消息,派发消息和处理消息: 3.实现消息的异步处理: Handler能够让你发送和处理消息,以及Runnable对象:每个Handler对象对应一个Thread和Thread的消息队列.当你创建一个Handler时,它就和Thread的消息队列绑定在一起,然后就可以传递消息和runnable对象到消息队列中,执行消息

nginx与php-fpm原理

一.正向代理与反向代理 1.正向代理:访问google.com google.com   vpn需要FQ才能访问 vpn 对于我们来说是可以感知到的(我们连接vpn),但对于google服务器是不知道的,google只知道有http请求来过. 对于人来说可以感知到,但服务器感知不到的服务器,我们叫他正向代理服务器. 2.反向代理:通过反向代理实现负载均衡 访问baidu,百度有个代理服务器,通过这个代理服务器,可以做负载均衡,路由到不同的server 此代理服务器,对我们来说是不可感知的,(我们

Docker存储驱动之Device Mapper简介

Device Mapper是一个基于kernel的框架,它增强了很多Linux上的高级卷管理技术.Docker的devicemapper驱动在镜像和容器管理上,利用了该框架的超配和快照功能.为了区别,本文使用Device Mapper指驱动中的框架,而devicemapper指Docker的存储驱动. 注意:商业支持的Docker Engine(CS-Engine)建议在RHEL和CentOS上使用devicemapper存储驱动. AUFS之外的另一种选择 Docker最初运行在Ubuntu和

Understanding the JVM

The aim to write this blog is that I want to summerize and NOTE what I have learned with the booked called as Understanding the JVM Advandced features and Best prac Now it's the first chapter reviews : ? This chapter didn't talk much ,just the histor

oracle内存结构

一.内存结构 SGA(System Global Area):由所有服务进程和后台进程共享: PGA(Program Global Area):由每个服务进程.后台进程专有:每个进程都有一个PGA. 二.SGA 包含实例的数据和控制信息,包含如下内存结构: 1)Database buffer cache:缓存了从磁盘上检索的数据块. 2)Redo log buffer:缓存了写到磁盘之前的重做信息. 3)Shared pool:缓存了各用户间可共享的各种结构. 4)Large pool:一个可选

kali Rolling安装docker

一.安装准备 kali linux是基于Debian Wheezy,所以我在Docker的官网按照Debian wheezy的方法安装,这里算是翻译一下吧. 测试系统:kali Rolling 64位 二.安装过程 先决条件 Docker需要一个64位的安装,无论你的Debian版本. 此外,你的内核必须至少是3.10. 最新的3.10次要版本或更新的维护版本也是可以接受的. 可以用下列命令来查看一下自己kali的内核头版本 # uname -r 1.对于Debian wheezy用户i必须提供

基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

boost-asio-cpp-network-programming阅读笔记

第二章:boost.asio 的基本原理 网络api boost.asio的命名空间 IP地址 端点 sockets 同步错误代码 socket成员函数 其他注意事项 read/write/connect自由函数 connect函数 read/write函数 异步编程 为什么要异步? 异步run()/run_one(),pool(),pool_one() 持续运行 run_one(),pool(),poll_one()函数 异步工作 异步post() vs dispatch vs wrap()

Java学习之字符串的创建

转自:http://lavasoft.blog.51cto.com/62575/80034/ Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 一.从根本上认识java.lang.String类和String池 首先,我建议先看看String类的源码实现,这是从本质上认识String类的根本出发点.从中可以看到: 1.String类是final的,不可被继承.public final class String.