内部存款和储蓄器相关

 

大廷广众,为了促成滑动界面,平时让Fragment与ViewPager1起结合使用,每3个ViewPager的页面正是3个Fragment,我们能够在fragment中实现拉长的作用。
它的大旨用法能够是上面那样

/*

1、创建一个或者多个你需要的Fragment类,其实就是类似activity一样,也有OnCreate()等回调函数。
fragmentsList = new ArrayList<Fragment>();
Fragment a = new aFragment();
Fragment b = new bFragment();
Fragment c= new cFragment();

fragmentsList.add(a);
fragmentsList.add(b); 
fragmentsList.add(c);

mPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager(), fragmentsList)); 
//注意如果是在Fragment中使用viewPager的话,那么就得使用
//mpager.setAdapter(new MyFragmentPagerAdapter(getChildFragmentManager(),fragmentsList));
mPager.setCurrentItem(0);
mPager.setOnPageChangeListener(new MyOnPageChangeListener());
mPager.setOffscreenPageLimit(3);      // 同时加载3个fragment 

 斯维夫特内部存储器管理:

 

 一.管理引用类型的内部存款和储蓄器, 不会管理值类型, 值类型不必要管理;

它的适配器:

 2.内部存款和储蓄器管理原则: 当没别的强引用指向对象,
系统会自动销毁对象(默许境况下具有的引用都以强引用);

import java.util.ArrayList;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class MyFragmentPagerAdapter extends FragmentPagerAdapter {//这里继承的是FragmentPagerAdapter
    private ArrayList<Fragment> fragmentsList;

    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }
    public MyFragmentPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragments) {
        super(fm);
        this.fragmentsList = fragments;
    }

    @Override
    public int getCount() {
        return fragmentsList.size();
    }

    @Override
    public Fragment getItem(int arg0) {
        return fragmentsList.get(arg0);
    }

    @Override
    public int getItemPosition(Object object) {
        return super.getItemPosition(object);
    }

     @Override 
     //public boolean isViewFromObject(View view, Object object) { 
     //        return view == object;//官方推荐写法
     //    }
     //事实证明,一旦加上这个方法,fragment的视图便无法显示,原因没去深究

}

 三.假如形成该标准: A瑞鹰C 自动回收内部存储器

上面的适配器继承的是FragmentPagerAdapter,除此而外还足以持续FragmentStatePagerAdapter,然则互相是有分别的。
壹.FragmentPagerAdapter继承自PagerAdapter ,主要用来展现八个Fragment页面,并且每2个Fragment都会被保留在fragment
manager中,最适用于那种少量且相对静态的页面,用户访问过的fragment都会被封存在内部存款和储蓄器中,即便她的视图层级只怕会在不可知时被灭绝。

    

 */

二.FragmentStatePagerAdapter继承自PagerAdapter,首要接纳Fragment来治本每一种页面。那些类同样用来保存和还原fragment页面包车型客车情形,越多用于大气页面,例如视图列表。当某些页面对用户不再可知时,他们的整套fragment就会被灭绝,仅保留fragment状态。***相比较于FragmentPager艾达pter,那样做的便宜是在*访问各类页面时能省去大批量的内部存款和储蓄器花费,但代价是在页面切换时会扩张相当多的付出。**

 

 

class Person {

他俩中间最大的例外在于:用户访问过的页面不可知之后是或不是会保留在内部处理于存中。

    var name:String

 

    init(name:String) {

*大家都领悟:ViewPager为了保险滑动的流畅性,viewpager在加载当前页的时候已经将pager页左右页的故事情节加载进内部存款和储蓄器里了(预加运载飞机制)。**当滑动到第n页的时候,adapter会为隔壁两页创设Fragment实例。*FragmentPagerAdapter和***FragmentStatePagerAdapter在那或多或少是同样的。***

        self.name = name

但是对于上上页:

    }

*FragmentPagerAdapter的做法:上上页实例保留,不过摧毁它的视图。*

    deinit {

***FragmentStatePagerAdapter的做法:果断摧毁上上页的实例(我不留情)。***

        print(“Person deinit”)

 

    }

留意:adapter的getItem()方法是当fragment不设有的时候才被调用,重临的是Fragment的实例。因此对此FragmentPagerAdapter,当每页的Fragment被创设后,那些函数就不会被调到了。而对于FragmentStatePagerAdapter则不然。

}

 

var p:Person? = Person(name: “xiaohange”)

 

//p = nil

**卸载不再须要的fragment****

 

**1.FragmentStatePagerAdapter:选取用remove(Fragment)方法将fragment从activity的FragmentManager中根本移除,在销毁 fragment时,它会将 其 onSaveInstanceState(Bundle)
方法中的Bundle音信保存下来。用户切换回原来的页面后,保存的实例状
 态可用于苏醒生成新的fragment.**

 

 

/** weak弱引用 **/

**贰.
FragmentPagerAdapter:选拔调用事务的detach(Fragment) 方法,FragmentPagerAdapter只是绝迹了fragment的视 图,但仍将 fragment实例保留在FragmentManager中。由此, FragmentPagerAdapter创造的fragment永远不会被灭绝。**

class Person2 {

 

    var name:String

**警戒区:
一.ViewPager.getChildCount()
重返的是方今ViewPager所管理的远非被销毁视图的Fragment,并不是有着的Fragment。想要获取具有的Fragment数量,应该调用ViewPager.getAdapter().getCount().**

    init(name:String) {

**2.主Activity要一而再FragmentActivity,唯有FragmentActivity内部才能内嵌Fragment普通Activity是这么些的。**

        self.name = name

三.activity和Fragment都要用android.support.v肆.app.Fragment,不然或者出现不只怕将Fragment的子类转换为Fragment的景色,会抛出转换极度。

    }

 

    deinit {

        print(“Person2 deinit”)

    }

}

//强引用, 引用计数+壹

var strongP = Person2(name: “hjq”) //1

var strongP2 = strongP //2

 

//壹.弱引用, 引用计数不变;

//二.万1采取weak修饰变量, 当对象释放后会自动将变量设置为nil;

//3.所以利用weak修饰的变量必定是一个可选类型,
因为唯有可选类型才能设置为nil.

weak var weakP:Person2? = Person2(name: “hjq”)

if let p = weakP{

    print(p)

}else{

    print(weakP as Any)

}

 

/*

 unowned无主引用, 也正是OC unsafe_unretained

 unowned和weak的区别:

 1.采纳unowned修饰的变量, 对象释放后不会安装为nil, 不安全;

   利用weak修饰的变量, 对象释放后会设置为nil;

 二.运用unowned修饰的变量, 不是可选类型; 利用weak修饰的变量, 是可选类型;

管理, 何时使用weak?

 哪天利用unowned?

 */

 

class Person3 {

    var name:String

    init(name:String) {

        self.name = name

    }

    deinit {

        print(“Person3 deinit”)

    }

}

unowned var weakP3:Person3 = Person3(name: “hjq”)

 

 

/*

 循环引用:

 AOdysseyC不是全能的, 它能够很好的化解内部存款和储蓄器难点,
不过在壹些场所不可能很好的缓解内部存款和储蓄器泄露难题;

 例如: 多少个大概四个指标之间的轮回引用问题

 */

 

//例1:

class Apartment {

    let number:Int      //房间号

    var tenant:Person4? //租客

    init(number:Int) {

        self.number = number

    }

    deinit {

        print(“\(self.number) deinit”)

    }

}

 

class Person4 {

    let name:String

    weak var apartment: Apartment? //公寓

    init(name:String) {

        self.name = name

    }

    deinit {

        print(“\(self.name) deinit”)

    }

}

 

var p4:Person4? = Person4(name: “han”)

var a4:Apartment? = Apartment(number: 888)

 

p4!.apartment = a肆 //人有1套公寓

a4!.tenant = p4!   //公寓中住着一人

// 四个对象未有被灭绝, 可是大家并未主意访问他们了, 那就应运而生了内存走漏!

p4 = nil

a4 = nil

 

 

 

//例2:

class CreaditCard {

    let number:Int

    //信用卡必须有所属用户;

    //当某叁个变量或常量必须有值, 平素有值, 那么可以运用unowned修饰

    unowned let person:Person5

    init(number:Int, person:Person5) {

        self.number = number

        self.person = person

    }

    deinit {

        print(“\(self.number) deinit”)

    }

}

class Person5 {

    let name:String

    var card:CreaditCard? //人不肯定有信用卡

    init(name:String) {

        self.name = name

    }

    deinit {

        print(“\(self.name) deinit”)

    }

}

var p5:Person5? = Person5(name: “XiaoHange”)

var cc:CreaditCard? = CreaditCard(number: 18888, person: p5!)

p5 = nil

cc = nil

 

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注