首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Iphone >

一个容易的socket+UItableView实现的聊天程序,引起的iOS内存管理的困扰!

2014-01-21 
一个简单的socket+UItableView实现的聊天程序,引起的iOS内存管理的困扰!!!!到了项目要结尾的时候了,真心有

一个简单的socket+UItableView实现的聊天程序,引起的iOS内存管理的困扰!!!!
        到了项目要结尾的时候了,真心有个蛋疼内存的问题无解,先求指正。如果明天还不能解决,本人决定重构这一部分的代码了。。

    我用一个了一个第三方的   AsycSocket 类获得克客户那边提供的Socket 然后就剩下的工作似乎就简单了,双方协议好 socket消息的封装格式,然后iOS客服端解析 每条消息,然后显示在聊天的UI中,UI我的实现思路是这样的,用tableView的每一个Cell来显示每条信息。选择这个控件的理由如下: 1,能方便的上下滑动,方便用户查看历史聊天纪录; 2,用户发送的信息做了图文混排生成一个UIVIew,每个UIVIew方便添加到界面上,3,每接受一条消息,UITableView自动滚动到最后一行,用户每次看到都是最新的信息。
     我接受的消息是放到一个  NSMutableArray *chatArr中的,然后有有新的消息进来,就加入数组,最多保存50条聊天纪录,超过则回按照先进 先出的原则删除掉旧的消息,然后用这个数组作为tableView的数据源      ;
  -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        return [chatArr count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SettingCell"];
        if (!cell) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SettingCell"] autorelease];
        }
        else {
            //移除单元格的子视图,为了重复使用
            if([[cell.contentView subviews] count] >0)
            {
                for (UIView *temp in [cell.contentView subviews]) {
                    [temp removeFromSuperview];
                }
            }
        }
       /*ImagesCharacterArrange 是实现图文混排的View的,我确定介个没有内存泄漏*/
        ImagesCharacterArrange *tempI_imageCharact = [[ImagesCharacterArrange alloc] init];
        tempI_imageCharact.backgroundColor=[UIColor clearColor];
        UIView *mesgeView = [tempI_imageCharact imagesCharactersArrange:[self getSingeMesgeView:row isPulic:NO] maxWidth:305 peopleName:[self getSingeMesgeHeader:row isPulic:NO] fontStyle:3];
        
       [cell.contentView addSubview:mesgeView];
        [tempI_imageCharact release];
    }


.......
if(有新的消息){
    数组处理
    [tableView  reload];



    兄弟们,我的问题来了,,每当有新的消息进来的时候,或者从别的地方切换到这个聊天窗口,内存都会血淋淋的增加好多
照这样的内存泄漏速度,用户聊天半个小时,程序必然跪,小弟用各种用工具查过,这一块尽然活生生的没有查出异常。
     大家又看出什么端倪,或者有什么其他的做这种方式聊天的方式嘛,新手迷途求指点!


[解决办法]
首先确认的一点是 你是不是使用的ARC?
你可以先看一下这个问题 排除是否是框架本身的问题如果不是框架的问题就要考虑是设计的问题
那就要具体在看代码了....
[解决办法]
设置断点啊 一步一步看代码怎么走的 
[解决办法]

引用:
没有使用ARC,暂时还不习惯这种自动管理被内存的方式。我其实怀疑是cell释放的问题,我打印cell的retainCount,在retrun cell之前,是有问题的,但是cell有着实不能释放。。。。纠结ing。。。

那你的聊天排版是不是用的第三方的? 看对方是不是用的arc你没有设置啊....
[解决办法]
我的个人建议是这个: ImagesCharacterArrange *tempI_imageCharact = [[ImagesCharacterArrange alloc] init];每次加载一个cell,就开辟一次内存,虽然说你已经release了,但是内存还在堆栈里的。。。。你还不如自定义一个cell,用ib关联,这样每次都可以重用,而不是每次新建立的cell,都要再开辟一次内存。
[解决办法]
对于内存泄漏最好还是用Leak测试一下,看看具体在什么地方。
同意楼上朋友所说的,最好还是自定义一个cell类,不要每次都addSubview
[解决办法]

曾经简单测试,一个viewcontroller  dimss之前,,release了的内存,不会即时回收,只有当viewcontroller dimss之后,这个viewcontroller中alloc的内存才会被回收掉。

目前我还没证实这是我的幻觉或是使用错误。抑或还是OC本身就是这样的一种机制。


LZ的问题,如果是从聊天窗口离开的时候,可以把聊天窗口dimss掉,内存占用的状况应该会好转。


------解决方案--------------------


引用:
曾经简单测试,一个viewcontroller  dimss之前,,release了的内存,不会即时回收,只有当viewcontroller dimss之后,这个viewcontroller中alloc的内存才会被回收掉。

目前我还没证实这是我的幻觉或是使用错误。抑或还是OC本身就是这样的一种机制。


LZ的问题,如果是从聊天窗口离开的时候,可以把聊天窗口dimss掉,内存占用的状况应该会好转。

这是oc的机制,release以后就算retaincount为0也不会马上释放内存,只有当前runloop退出以后才会去清

热点排行