2019-08-12 15:01:21 wzy_1704A 阅读数 30

public class MyDrawer extends FrameLayout {
private LinearLayout content;
private LinearLayout menu;
private int width=400;
//系统存值
PointF pointF=new PointF();
int x;
int y;

public MyDrawer(Context context) {
    super(context);
    init();
}

public MyDrawer(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public MyDrawer(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);
}
public  void init(){
    //主菜单
     content=new LinearLayout(getContext());
    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    content.setBackgroundColor(Color.GREEN);
    content.setOrientation(LinearLayout.VERTICAL);
    content.setLayoutParams(params);
     //侧滑菜单
    menu=new LinearLayout(getContext());
    FrameLayout.LayoutParams pr = new FrameLayout.LayoutParams(width, ViewGroup.LayoutParams.MATCH_PARENT);
    menu.setBackgroundColor(Color.RED);
    menu.setOrientation(LinearLayout.VERTICAL);
    pr.leftMargin-=width;
    menu.setLayoutParams(pr);



    addView(content);
    addView(menu);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    return super.dispatchTouchEvent(ev);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return true;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()){
        case  MotionEvent.ACTION_DOWN:
            pointF.x = event.getX();
            pointF.y = event.getY();
            break;
        case  MotionEvent.ACTION_MOVE:
            moveDrawer(event);
            break;
        case  MotionEvent.ACTION_UP:

            break;
    }
    return true;
}
private  boolean moveDrawer(MotionEvent event){
    if (Math.abs(pointF.x-event.getX())>5){
        int x= (int) (event.getX()-pointF.x);
        FrameLayout.LayoutParams layoutParams = (LayoutParams) menu.getLayoutParams();
        int nowx=layoutParams.leftMargin;
        layoutParams.leftMargin=nowx+x;

        if (layoutParams.leftMargin>0){
            layoutParams.leftMargin=0;
        }
        if (layoutParams.leftMargin<-width){
            layoutParams.leftMargin=-width;
        }

        menu.requestLayout();
        pointF.x=event.getX();
        pointF.y=event.getY();
    }
    return  true;
}

}

2015-11-19 10:05:40 Star__shine 阅读数 339


比如植物大战僵尸、开心消消乐,每一个僵尸就是一个对象,每一个方块也是一个对象,既然是对象系统就会分配内存(堆内存),那么死去的僵尸和消除的方块应该如何处理?
iOS系统会给每一个运行的软件一块内存空间。应用程序使用内存超过这个内存空间,程序就会被系统主动关闭
为什么要使用内存管理?
应用程序崩溃%90以上都是内存问题引起的,了解内存管理的原则,能够减少我们程序的出错机率
出现内存问题一般有两个方面:内存溢出、野指针访问
1.内存溢出:
iOS给每个应用程序提供了一定的内存,iPhone 3GS内存30M左右,一旦超出内存上限程序就会crash(崩溃、闪退)
程序开发过程中最占用内存的是图片、音频、视频等资源文件
3.5寸非Retina屏幕像素是320*480,而一张全屏的图片所占的内存(320*480*4)(一个像素占四个字节,存放RGBA),那么同时读取30张图片程序就会崩溃
3.5Retina屏幕640*960
一张全屏图片所占内存空间640*960*4 = 2457600/1024 = 2.4M
内存溢出也就是超出了给你限定的内存区域导致的问题,就跟用容器装水一样,超出了容器的水就会溢出
2.野指针访问:
对象的内存已经被系统回收,仍然使用指针操作这块内存,野指针操作是程序crash的主要原因,代码量越大越难找出野指针的位置,
了解程序内存管理能帮我们提升程序的性能,减少bug调试时间
那么我们如何管理内存?
有创建就要有销毁
所谓的内存管理就是对对象的创建和销毁的过程进行管理
内存管理方式:
1.垃圾回收:(javaC#C++OC(只支持Mac OS))
2.手动管理内存
C语言:malloc free
C++
OCMRCManual Reference Count)手动 引用 计数
3.自动管理内存:ARCAuto Reference Count)自动 引用 计数,iOS 5之后的新特性,并不是垃圾回收
     
垃圾回收机制:
程序员只需要开辟空间,不需要用代码进行释放,系统来判断那些空间不再被使用,并回收这些内存空间,以便再次分配。整个回收的过程不需要写任何代码,由系统自动完成垃圾回收,Java中一直是用的就是这种自动回收技术
     
 MRC
手动引用计数:内存的开辟和释放都有程序的代码控制,相对于垃圾回收机制,MRC对内存的控制更加灵活,可以在需要释放的时候及时释放,对程序员要求较高,程序员要熟悉内存管理机制
 ARC
自动引用计数:
iOS 5的编译器新特性,只允许用户开辟空间,不用释放空间。它不是垃圾回收机制,本质还是MRC,只是编译器帮程序员默认加入了释放的代码
iOS内存管理:
iOS支持三种内存管理:MMRCARC、垃圾回收(Mac OS
MRC的内存管理机制是引用计数机制
AR是基于MRC的。
内存管理机制--引用计数
OC采用引用机制管理对象所占内存
实际开发中,经常遇到多个指针指向同一个内存地址的情况,C语言无法记录内存使用者的个数
计数:计数器,用于统计数字
引用计数:某一块内存,拥有这块内存的拥有者个数
拥有者(owner):使用这块内存区域的对象
NSObject类及其子类都有一个属性,用来记录当前对象的引用计数
OC采用计数机制管理内存,当一个新的引用只想对象时,引用计数器就加1,当不再使用的时候,引用计数就减1,当引用计数为0时,该对象将释放所占有的资源.
生命周期
实例对象的生命周期
出生于alloc方法,死亡于dealloc方法
通过类发送alloc消息获得的实力对象的引用计数赋值为1,当实例对象引用计数为0时,自动对该对象发送dealloc消息
影响引用计数的方法:
+alloc:开辟内存空间,让被开辟的内存空间的引用计数变为1。这是从01的过程。
-retain持有的意思,对象引用计数+1并且拥有该对象的所有权如果对象原来引用计数为1,那么return之后变为2,如果引用计数是5return之后为6.
copy:把某一内存区域的内容拷贝一份,拷贝到新的内存空间里去,被拷贝区域的引用计数不变新的内存区域引用计数变为1,拥有新的被copy出来的对象的所有权。
release:引用计数-1并释放对象的所有权,如果内存空间之前引用计数为4release之后引用计数变为3
autorelease:未来的某一时刻引用计数-1
dealloc:继承自父类(NSObject)的方法,当对象的引用计数为0时,由系统使用该对象调用dealloc方法
dealloc方法我们不能自己调用
        
自动释放池:NSAutoReleasePool
当创建的对象在未来的某个时间销毁时,可以使用autorelease,将对象所有权交给最近的NSAutoReleasePool对象,尽量少使用自动释放池
autoreleasepool控制使用autorelease对象的释放,这个对象何时释放 取决于这个autoreleasepool
新的autoreleasepool写法
 @autoreleasepool{
 Person *person2 =[[Person alloc]init];
[person2 retain];
[person2 autorelease];
}
person引用计数为0,但是nslog之后还是1,因为当当对象引用计数为0时会被释放,而你又输出这个释放对象的这个是访对象的引用计数,也就是这个输出根本不成立,打印出来的东西也毫无意义
内存管理原则
凡是出现alloc、retain、copy的地方,都应该出现release或者autorelease与之对应属性为retain、copy的时候,需要在类的dealloc方法中释放这个属性
凡是使用了alloc、retain、copy让内存的引用计数增加了,就需要使用release或者autorelease让内存的引用减少,在一段代码内增加和减少的次数要相等
copy方法
跟retain不同,一个对象想要copy声称自己的副本,需要遵从NSCopying协议,NSCopying协议中有一个必须实现的协议方法,如果没有遵循NSCopying协议,挥着诶有实现里面的协议方法,就会导致崩溃,我们需要在copyWithZone这个方法中定义copy的细节

1.属性的内部实现原理
2.dealloc内部释放实例变量
3.便利构造器方法的实现原理
4.collection的内部管理
属性的语义设置与使用范围
dealloc释放的是类本身的内存。
使用mutable时,复制出的新对象和原来对象的引用计数都为1,新对象release之后就不能再访问
实例变量需要在dealloc中去释放,否则会造成内存泄露
dealloc方法是NSObject的一个实例方法,与alloc的对应,用于回收开辟的内存空间
dealloc方法在对象的引用计数为0时由系统去调用
通常在dealloc中释放类的实例变量
dealloc不能手动调用(永远不要去手动调用)
dealloc中最后一行,必须写[super dealloc]
集合(collection)的内存管理
collection会自动管理添加删除的对象的内存,我们只需要管理集合的生成和释放
添加的元素会被retain
删除的元素会被release
集合释放的时候,会对每一个对象发送release消息

2015-02-26 20:25:25 leishui513 阅读数 223
#import <Foundation/Foundation.h>
/*
1.set方法内存管理相关的参数
retain :release 旧值,retain新值
assign :直接赋值(默认,适应于非oc对象类型)
copy :release旧值,copy真值

2.是否要生成set方法
readwrite :同时生成setter和getter的声明,实现
readonly:只会生成getter的声明,实现

3.nonatomic :性能高(一般用这个)
 atomic : 性能低(默认)
 
4.setter和getter方法的名称
setter :决定了set方法的名称,一定要有个冒号:
getter :决定了get方法的名称(一般用在BOOL类型)


@property (getter = abc,setter = serAabc) int age;

//返回Bool类型的方法名一般以is开头
//@property (getter = isRich) BOOL rich;
*/
@interface Book : NSObject、
@property int price;
@end
@implementation Book
@end

/*@interface Person : NSObject
{
	Book *_book;	
}
- (Book *)book;
- (void)setBook:(Book *)book;
@end

@implementation Person
- (Book *)book
{
	return _book;	
}*/

@interface Person : NSObject
@property (nonatomic,retain,readwrite) Book *book;
@end
@implementation Person
- (void)dealloc
{
	[_book release];
	[super dealloc];	
}
@end
int main (int argc, const char *argv[]) 
{ 
    
    return 0;
}

2016-08-10 19:13:02 patkritLee 阅读数 436

1.最佳置换算法

定义:最佳置换算法是指,其所选择的被淘汰的页面,将是以后永不使用的,或是在最长(未来)时间内不再被访问的页面。采用最佳置换算法,通常可保证获得最低的缺页率。

但由于人们目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法无法实现。但是可以利用该算法来评价其他算法。

算法过程:

举例说明

假定系统为某进程分配了三个物理块,并考虑有以下的页面号引用串:

 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1

       进程运行时,先将7,0,1 三个页面装入内存。以后,当进程要访问页面2 时,将会产生缺页中断。此时OS根据最佳置换算法,将选择页面7 予以淘汰。这是因为页面0 将作为第5 个被访问的页面,页面1 是第14 个被访问的页面,而页面7 则要在第18 次页面访问时才需调入。下次访问页面0时,因它已在内存而不必产生缺页中断。当进程访问页面3时,又将引起页面1 被淘汰;因为,它在现有的1,2,0 三个页面中,将是以后最晚才被访问的。下图所示出了采用最佳置换算法时的置换图。由图可看出,采用最佳置换算法发生了6 次页面置换。


利用最佳页面置换算法时的置换图

2.先进先出页面置换算法

定义:优先淘汰最早进入内存的页面,即在内存中驻留时间最久的页面。该算法实现简单,只需把调入内存的页面根据先后次序链接成队列,设置一个指针总指向最早的页面。

但该算法与进程实际运行时的规律不适应,因为在进程中,有的页面经常被访问。

假定系统为某进程分配了三个物理块,并考虑有以下页面号引用串:7, 0, 1, 2, 0, 3, 0,4,2,3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1。釆用FIFO算法进行页面置换,进程访问页面2时,把最早进入内存的页面7换出。然后访问页面3时,再把2, 0, 1中最先进入内存的页换出。由下图可以看出,利用FIFO算法时进行了12次页面置换。
访问页面 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
物理块1 7 7 7 2   2 2 4 4 4 0     0 0     7 7 7
物理块2   0 0 0   3 3 3 2 2 2     1 1     1 0 0
物理块3     1 1   1 0 0 0 3 3     3 2     2 2 1
缺页否          
3.最近最久未被使用(LRU)置换算法

选择最久最长时间未访问过的页面予以淘汰,它认为过去一段时间内未访问过的页面,在最久的将来可能也不会被访问。

该算法为每个页面设置一个访问字段,来记录页面自上次被访问以来所经历的时间,淘汰页面时选择现有页面中值最大的予以淘汰。

LRU(least recently used)最近最少使用。
假设 序列为 4 3 4 2 3 1 4 2
物理块有3个 则
首轮 4调入内存 4
次轮 3调入内存 3 4
之后 4调入内存 4 3
之后 2调入内存 2 4 3
之后 3调入内存 3 2 4
之后 1调入内存 1 3 2(因为最少使用的是4,所以丢弃4)
之后 4调入内存 4 1 3(原理同上)
最后 2调入内存 2 4 1

2016-11-06 21:06:25 qq_33152199 阅读数 170

上周项目的X612批次的开发工作正式启动,我负责内管部分新增功能的开发,

内管系统采用spring-mvc和ibatics框架结合,具体开发中遇到的问题如下

1. 在内管实现系统公告的配置过程中有关分行BH号的处理,

     具体实现是 设计一个button,点击之后可以得到一个div块,上面显示从其他表中得到的所有BH信息,然后选择我们的BH信息,并在页面回显出来。

      分行BH号并不在本批次给定的数据表中,无法直接查询,需要使用之前开发的部分功能得到,在notice.jsp页面,写了一个单独的AJAX交互方式,action 指向之前查询BH的controller层,可以得到list表单全部信息,因此得到全部BH信息。

     因为之前是先定义了实体类,所以页面的表单的BH有关的name定义成了user_bh,但是在之前的开发中已经定义了JSP中的ID为branchId。因此在第一次没有回显出BH号。

   解决方法: 第一种方法  在BH号最早的JSP中,给我们本次notice.jsp页面相关ID赋值。不能修改branchId,因为在内管其他页面已经使用过了。 

                      第二种方法  在notice的实体类中,定义的BH域 做修改,改为branchId与之前所写的对应起来,并且在与sql中对应的列名修改对应。

2。 因为是在内管中配置公告系统,公告标题和内容不能简单的使用input框,textarea等。所以需要导入其他的框架,并且映射到textarea上。

       在内管系统中的开发,JSP中,ID用来获得值和赋值,name用来表单和后台实体对应,此为基础。

 下图为导入的文本编辑器框架.

 

       在与内容有关的部分,我们这样写


        hidden 部分为和后台实体类对应的name 和 id。

        textarea 为和JS中对应的name以及ID

function kedit(){
KindEditor.create('textarea[name="content1"]',
{   
width : "100%", //编辑器的宽度为70%
height : "100px", //编辑器的高度为100px 
filterMode : false, //不会过滤HTML代码
resizeMode : 1 ,//编辑器只能调整高度 
urlType : 'domain',//改变站内本地URL
cssPath : 'texttarea/plugins/code/prettify.css',
uploadJson : '../texttarea/jsp/upload_json.jsp',
fileManagerJson : '../texttarea/jsp/file_manager_json.jsp',
items:[ //配置编辑器的工具栏,其中”/”表示换行,”|”表示分隔符。
       'source', '|', 'undo', 'redo', '|', 'preview', 'print', 'template', 'code', 'cut', 'copy', 'paste',
       'plainpaste', 'wordpaste', '|', 'justifyleft', 'justifycenter', 'justifyright',
       'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
       'superscript', 'clearhtml', 'quickformat', 'selectall', '|', 'formatblock', 'fontname', 'fontsize', '|', 'forecolor', 'hilitecolor', 'bold',
       'italic', 'underline', 'strikethrough', 'lineheight', 'removeformat', '|',
       'insertfile', 'table', 'hr', 'pagebreak',
       'anchor', 'link', 'unlink' , 'fullscreen'
],
newlineTag:'br',//设置回车换行标签
       //下面这行代码就是关键的所在,当失去焦点时执行 this.sync();
       afterBlur: function(){this.sync();}

});
prettyPrint();
}


上面为对应的JS文本编辑代码。仅供参考。

文章标题

阅读数 99

没有更多推荐了,返回首页