MJRefresh
MJRefresh copied to clipboard
重写drawRect有额外的内存开销建议优化
MJRefreshComponent.m 重写drawRect有额外的内存开销建议优化
为啥
举个例子
https://stackoverflow.com/questions/14659563/to-drawrect-or-not-to-drawrect-when-should-one-use-drawrect-core-graphics-vs-su
暂时没有找到 drawRect 之后的某个方法. 便于更新刷新状态.
从UIView源码内部实现逻辑看,并不会影响内存的开销,而调用[super drawRect:rect] 仅仅是调用了一个空方法。
况且很多系统的UI控件都实现了drawRect方法,都有自定义的绘制任务,也没有说会影响内存。

/* @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;
}
暂时没有找到 drawRect 之后的某个方法. 便于更新刷新状态.
是否可以加入个刷新状态例如init,只用来处理初次进入时候布局操作,在用户进行touch to pull 的时候进入刷新状态切换。