欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

corePlot使用技巧及iOS内存优化之道

程序员文章站 2023-01-24 19:28:26
coreplot 使用技巧: 设置内边距: graph.plotareaframe.paddingleft   +=5; graph.plotareafr...

coreplot 使用技巧:
设置内边距:
graph.plotareaframe.paddingleft   +=5;

graph.plotareaframe.paddingtop    +=5;

graph.plotareaframe.paddingright  +=5;

graph.plotareaframe.paddingbottom +=17.5;

 


禁止缩放:(两指捏扩动作)
[selfsetallowpinchscaling:no];//禁止缩放

 


设置坐标只能按照x轴横向滑动:(其他方向请自行理解)
plotspace.yrange = [cptplotrangeplotrangewithlocation:cptdecimalfromint(0)length:cptdecimalfromfloat(1)];

plotspace.globalyrange = [cptplotrangeplotrangewithlocation:cptdecimalfromint(0)length:cptdecimalfromfloat(1)];

plotspace.xrange = [cptplotrangeplotrangewithlocation:cptdecimalfromint(1)length:cptdecimalfromfloat(1)];

plotspace.globalxrange = [cptplotrangeplotrangewithlocation:cptdecimalfromint(0)length:cptdecimalfromfloat(2)];

 


自定义轴label:
x.axislabels          = [self buildlabeltitle];

x.labelingpolicy      = cptaxislabelingpolicynone;//当设置这个policy之后,坐标轴label及背景线tick都需要自己绘制,否则显示为空,请不要过度惊慌

x.minorticklocations  = [nssetsetwitharray:locationlabels];

 


- (nsmutableset*)buildlabeltitle

{

    nsmutableset *newaxislabels = [nsmutablesetset];

   

    cptmutabletextstyle *textstyleb = [cptmutabletextstyletextstyle];

    textstyleb.color = [cptcolorcolorwithcomponentred:cptfloat((float)0x09/0xff)green:cptfloat((float)0x31/0xff)blue:cptfloat((float)0x4a/0xff)alpha:cptfloat(1.0)];

 


    int n = 1;

    for ( nsuinteger i =30; i > 0; i--)

    {

        cptaxislabel *newlabel = [[cptaxislabelalloc] initwithtext:@“这里是内容”

                                                          textstyle:textstyleb];

        newlabel.ticklocation =cptdecimalfromunsignedinteger(n++);

        newlabel.offset = 5;

        [locationlabels addobject:[nsnumber numberwithfloat:(n-1) -0.25]];

        [locationlabels addobject:[nsnumber numberwithfloat:(n-1) +0.25]];

        [newaxislabels addobject:newlabel];

        [newlabel release];

    }

    return newaxislabels;

}

 


刷新图表内容:
[[bar1graph] reloaddata];

 


组织数据源:
[m_so2onlinecaddobject:[nsmutabledictionarydictionarywithobjectsandkeys:x, @"x", y,@"y", nil]];

if (tmpy> max_data)

{

    max_data = tmpy;

}

 


使用数据源:
if ([(nsstring*)plot.identifierisequaltostring:kbar1])

{

    switch (fieldenum)

{

    casecptbarplotfieldbarlocation:

        number = [[[m_so2onlinecobjectatindex:index] valueforkey:@"x"]doublevalue];

        break;

    casecptbarplotfieldbartip:

        number = [[[m_so2onlinecobjectatindex:index] valueforkey:@"y"]doublevalue]/ max_data;

        break;

    default:

        break;

    }

}

这里要记录max_data的原因是这里最好使用真实数据的相对数据,否则当数据值很大的时候会消耗coreplot的性能导致图形加载很慢。

 


用延迟函数去调用数据初始化可以提高加载速度:
[selfperformselector:@selector(initplotdata)withobject:nilafterdelay:0.2];

 


计算日期的简单方法:
nsdatecomponents* comps = [[nsdatecomponentsalloc]init];

[comps setday:-i];

nsdate *newdate = [[nscalendarcurrentcalendar] datebyaddingcomponents:compstodate:[nsdate date]options:0];

--------------------------------------------------------

ios内存优化及排查方法

1.iboutlet 对象需要release

 


2.不停的往uiview,特别是uiscrollview上add相同subview。一定要记得清除之前的subview,并且在dealloc函数中执行该方法
for (uiview* sbviewin scrvbg.subviews)

{

    [sbview removefromsuperview];

}

这里还有个获得subview的小技巧:

[subview settag:300];

subview = [self.viewviewwithtag:300]

 


3.dealloc不一定会被调用,所以可以自己手写一个myrelease方法,当退出该界面的时候手动调用release需要释放的对象,并且将其置为nil。

 

4.记住,如果你不太明白uiview的drawrect的调用时机,千万不要轻易往drawrect里写代码,特别是没有立即release的对象。很容易在这里因为多次调用了drawrect而没有release该对象导致内存溢出。

 

5.检查内存泄漏最好的工具是xcode,当然不是说xcode工具排查完了就ok了。我们发现xcode只能检查明显的代码级别泄漏,而像上面第四点因为多次调用某个函数却没有配对release的逻辑性泄漏是排查不出来的,只能通过代码排查。
我这里能给出的经验就是,alloc的对象应该立即release。如果该对象不能立即release,必须保证alloc和release必须配对调用,特别要留意那些可以多次调用且包含alloc却未被及时release的函数。四个字概括“非常危险”!

 


6.属性对象不要用self.来alloc它,例如:
self.my_arr =[[nsarray alloc]init];    ----------     错误!

 


nsarray *tmparr = [[nsarray alloc]init];

self.my = tmparr;

[tmparr release];                               ----------      正确