首页 > 代码库 > 关于iOS上使用WWW引起的内存泄漏的临时解决方案

关于iOS上使用WWW引起的内存泄漏的临时解决方案

原地址:http://www.unity蛮牛.com/thread-16493-1-1.html

 

目前,在的4.3.3.和4.3.4版本中存在一个iOS平台上的内存泄漏问题,即当使用WWW来下载和加载Assetbundle文件时,如果按照以下方式来进行,则会造成Assetbundle卸载后内存不能完全释放的情况。

  对此,Unity官方已经就该问题进行了修复,并在下一个版本中进行更新。但对于目前仍在使用4.3.3和4.3.4两个版本上进行开发的项目,建议使用以下的临时解决方案,具体步骤如下:

目前,在unity的4.3.3.和4.3.4版本中存在一个iOS平台上的内存泄漏问题,即当使用WWW来下载和加载Assetbundle文件时,如果按照以下方式来进行,则会造成Assetbundle卸载后内存不能完全释放的情况。

  对此,Unity官方已经就该问题进行了修复,并在下一个版本中进行更新。但对于目前仍在使用4.3.3和4.3.4两个版本上进行开发的项目,建议使用以下的临时解决方案,具体步骤如下:

  1.将Unity工程发布成Xcode工程;

  2.在生成的Xcode工程中找到文件:Classes/Unity/WWWConnection.mm;

  3.打开并查找函数: “extern ”C“ void UnityDestroyWWWConnection(void* connection)”;

  4.  将该函数做如下修改;

  修改前:

  
[AppleScript] 纯文本查看 复制代码

extern“C”voidUnityDestroyWWWConnection(void* connection)
 
  {
 
  UnityWWWConnectionDelegate* delegate = (UnityWWWConnectionDelegate*)connection;
 
  [delegate.connection cancel];
 
  delegate.connection = nil;
 
  [delegate release];
 
  }


  修改后:

[AppleScript] 纯文本查看 复制代码

extern“C”voidUnityDestroyWWWConnection(void* connection)
 
 {
 
 UnityWWWConnectionDelegate* delegate = (UnityWWWConnectionDelegate*)connection;
 
 [delegate cleanup];
 
 [delegate release];
 
 }
 

5.接下来需要再添加一个cleanup函数,具体做法是先查找函数:

[AppleScript] 纯文本查看 复制代码
- (void)connection:(NSURLConnection*)connection
 
didReceiveResponse:(NSURLResponse*)response”
 
然后在该函数的上方插入cleanup函数,函数内容如下:
 
- (void)cleanup
 
{
 
[_connection cancel];
 
_connection = nil;
 
[_data release];
 
_data = nil;
 
}


  6.经过上述修改,正常发布到设备上即可。

  说明:

  1、该问题仅存在于iOS平台;

  2、该问题仅存在于4.3.3和4.3.4两个版本上,4.3.2及之前版本并不存在该问题;

  3、另一常用加载API:WWW. LoadFromCacheOrDownload不会造成内存泄露问题。