美文网首页fighting~iOS Developer程序员
多个Cell共用一个控件导致死循环和内存暴涨

多个Cell共用一个控件导致死循环和内存暴涨

作者: xshenpan | 来源:发表于2016-05-06 15:26 被阅读409次

    新手

    • 在给cell的accessoryView赋值时发现每个辅助视图都要创建一个view,每个view又都相同,然后我就想能不能只创建一次,给每个cell都赋值同一个view,于是就有了如下代码:
    /**
       *  其中有一部分是在storyboard中完成的
       */
    
    @interface XSPTableViewController ()
    //每个cell的辅助视图都为arrowView
    @property (nonatomic, strong) UIImageView *arrowView;
    @end
    
    @implementation XSPTableViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
    }
    //懒加载
    - (UIImageView *)arrowView
    {
        if (_arrowView == nil) {
            _arrowView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow_right"]];
        }
        return _arrowView;
    }
    
    #pragma mark - Table view data source
    //一共10个Cell
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return 10;
    }
    //返回每个cell
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        XSPTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
        cell.accessoryView = self.arrowView;
        return cell;
    }
    @end
    

    *** 然后,他就死掉了!!! 内存暴涨 ***
    如图:

    Snip20160506_2.png
    • 但是xcode有没有触发异常,内存都占用了400多M,还是没有报异常
    • 最后自定义一个cell,然后重写了好多方法,发现程序在layoutSubviews方法中死循环
    Snip20160506_1.png
    • 代码如下:
      @implementation XSPTableViewCell
    - (void)layoutSubviews
    {
        [super layoutSubviews];
        NSLog(@"%s", __func__);
    }
    @end
    

    还请各位大神解释下原因啊!搞不懂为什么。新手一枚,大神勿喷!

    相关文章

      网友评论

      • FLNuo:你的这段代码cell只是一个空指针吧??
      • DXSmile:cell返回的方法中, 要对cell做nil判断, 这样你的重用才会起作用, 而且cell重用ID最好是静态的,
        xshenpan:@DXSmile 我storyboard设置了重用标识,tableview控制器是从storyboard拖出来的,当cell为空时,系统会自动创建一个和storyboard中的cell重用标识一样的cell,所以我就没有判断nil
      • 志城:今天我试试看。
        xshenpan:@志城 嗯嗯,我开始也是每个都重新创建,觉得都是一样的图片就想共用一个,结果就死循环了
        志城:不是cell的原因,而是UITableViewCell的accessoryView的原因,你这样设置所有cell都是持有的同一个对象(@property (nonatomic, strong, nullable) UIView *accessoryView;)这里用的 strong修饰,你不应该用同一个对象设置accessoryView,一般而言都是重新创建,具体内部的机制现在还不清楚。
        xshenpan:@志城 感谢
      • bigParis:cell没注册也没判空
        xshenpan:@bigParis tableview控制器在storyboard中拖的,重用标识也是在storyboard中设置的,所以代码中没写
      • 不只是说说:没有重用, 滑动时创建了无限多个cell, 导致内存增加, 最后卡死
        不只是说说:是你没出现一个, 都会创建一个新的cell, 和你返回的数量没关系 好吧, 就是重用的问题
        xshenpan:@xshenpan 而且就算没重用,那最多也只会创建十个啊
        xshenpan:@不只是说说 重用了啊,cell是从缓存池中拿出来的啊
      • 杰杰_94058:抱着满满的期待进来,想看看这个开发小几钱,没想到……
        xshenpan:@杰杰_94058 说下见解呗😃

      本文标题:多个Cell共用一个控件导致死循环和内存暴涨

      本文链接:https://www.haomeiwen.com/subject/nirjrttx.html