MJRefresh icon indicating copy to clipboard operation
MJRefresh copied to clipboard

重写drawRect有额外的内存开销建议优化

Open shixiaoda opened this issue 8 years ago • 6 comments

MJRefreshComponent.m 重写drawRect有额外的内存开销建议优化

shixiaoda avatar Nov 15 '17 09:11 shixiaoda

为啥

JackCoderForLove avatar Nov 15 '17 09:11 JackCoderForLove

举个例子

JackCoderForLove avatar Nov 15 '17 09:11 JackCoderForLove

https://stackoverflow.com/questions/14659563/to-drawrect-or-not-to-drawrect-when-should-one-use-drawrect-core-graphics-vs-su

FelixWuFWD avatar Aug 02 '18 10:08 FelixWuFWD

暂时没有找到 drawRect 之后的某个方法. 便于更新刷新状态.

wolfcon avatar Nov 27 '19 07:11 wolfcon

从UIView源码内部实现逻辑看,并不会影响内存的开销,而调用[super drawRect:rect] 仅仅是调用了一个空方法。

况且很多系统的UI控件都实现了drawRect方法,都有自定义的绘制任务,也没有说会影响内存。

1589182844809

/* @class UIView(CALayerDelegate) */
-(int)drawLayer:(int)arg2 inContext:(int)arg3 {
    var_40 = d9;
    stack[-72] = d8;
    r31 = r31 + 0xffffffffffffffb0;
    var_30 = r24;
    stack[-56] = r23;
    var_20 = r22;
    stack[-40] = r21;
    var_10 = r20;
    stack[-24] = r19;
    saved_fp = r29;
    stack[-8] = r30;
    r20 = arg3;
    r19 = arg0;
    loc_18781e2e8(arg0, @selector(bounds), arg2, arg3);
    v8 = v1;
    if (*(r19 + sign_extend_64(*(int32_t *)_OBJC_IVAR_$_UIView.__preferedContentsFormat)) == 0x1) {
            r0 = **-[UIKBSplitKeyplaneGenerator dealloc];
            r0 = loc_1826d0c70(r0);
    }
    else {
            r0 = loc_1826d0b50();
    }
    loc_1827868ec(r20, r0);
    loc_182786a58(r20, r22);
    loc_182931b28(r22);
    _UIGraphicsPushContext(r20);
    r23 = sign_extend_64(*(int32_t *)0x1b0653860);
    if ((*(r19 + r23) & 0x20) != 0x0) {
            r22 = loc_18781fbf4(r19, 0x1ab3d8b40);
            loc_1827e925c();
            if (d0 == 0x0) {
                    r24 = sign_extend_64(*(int32_t *)0x1b065398c);
                    if (((loc_18781e2e8(*(r19 + r24), @selector(isOpaque)) & 0x1) != 0x0) || ((loc_18781e2e8(*(r19 + r24), @selector(clearsContext)) & 0x1) == 0x0)) {
                            loc_182785c48(r20);
                            if (*(int32_t *)0x1b1ac98a8 != 0x0) {
                                    if (*(int32_t *)0x1b1ac98a8 < 0x301ff) {
                                            if ((*(r19 + r23) & 0x880000 ^ 0x80000) == 0x0) {
                                                    loc_18278876c(r20);
                                            }
                                    }
                            }
                            else {
                                    if ((__UIApplicationLinkedOnOrAfter(0x30200) & 0x1) == 0x0) {
                                            if ((*(r19 + r23) & 0x880000 ^ 0x80000) == 0x0) {
                                                    loc_18278876c(r20);
                                            }
                                    }
                            }
                            _UISetColor(r22);
                            loc_18781e2e8(r19, @selector(bounds));
                            _UIRectFill();
                            loc_182785ca0(r20);
                    }
            }
            else {
                    loc_182785c48(r20);
                    if (*(int32_t *)0x1b1ac98a8 != 0x0) {
                            if (*(int32_t *)0x1b1ac98a8 < 0x301ff) {
                                    if ((*(r19 + r23) & 0x880000 ^ 0x80000) == 0x0) {
                                            loc_18278876c(r20);
                                    }
                            }
                    }
                    else {
                            if ((__UIApplicationLinkedOnOrAfter(0x30200) & 0x1) == 0x0) {
                                    if ((*(r19 + r23) & 0x880000 ^ 0x80000) == 0x0) {
                                            loc_18278876c(r20);
                                    }
                            }
                    }
                    _UISetColor(r22);
                    loc_18781e2e8(r19, @selector(bounds));
                    _UIRectFill();
                    loc_182785ca0(r20);
            }
    }
    if (loc_18781e2e8(r19, @selector(_canDrawContent)) != 0x0) {
            loc_182787dd8(r20);
            loc_18781e2e8(r19, @selector(drawRect:));
    }
    r29 = saved_fp;
    r30 = stack[-8];
    r31 = r31 + 0x50;
    r0 = _GetContextStack(0x0);
    r0 = _PopContextFromStack(r0);
    return r0;
}

kinarobin avatar May 11 '20 07:05 kinarobin

暂时没有找到 drawRect 之后的某个方法. 便于更新刷新状态.

是否可以加入个刷新状态例如init,只用来处理初次进入时候布局操作,在用户进行touch to pull 的时候进入刷新状态切换。

liangxiuchen avatar May 27 '20 08:05 liangxiuchen