成都创新互联网站制作重庆分公司

android指针,安卓 指针

android空指针异常

android空指针异常的解决方法为:

成都创新互联从2013年开始,是专业互联网技术服务公司,拥有项目成都网站设计、网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元芜湖县做网站,已为上家服务,为芜湖县各地企业和个人服务,联系电话:18982081108

1、findviewbyid返回值为null

出现findviewbyid返回值为null时,改一下名字就可以,可能是名称与控件的名称一样造成的。

2、location不是马上就能获取到的,应该判断一下,空的话就返回,等到下次获取,模拟机是获取不到得,要用真机。

android 没有空指针为什么报空指针异常

这个不是Android的问题,而是Java语言基础内容。

1.Java中所谓的指针,是指对象的引用。比如String str;这个str就是指针。

2.空指针是说指针的内容为空,比如上面的str,如果令它指向null,就是空指针。

3.空指针异常就是一个指针是空指针,你使用了这个空指针的方法,既然它指向的是空对象,它就不能使用这个对象的方法。比如上面的str假如为null,你还要用str的方法,比如str.equals( String x);那么就会产生空指针异常。

android智能指针介绍

android中有三种智能指针,分别是轻量级指针,强指针,弱指针。轻量级指针实现简洁,效果类似于强指针,然后强指针和弱指针的实现比较复杂比较重一些。本篇就介绍下这三种指针的具体实现。

轻量级指针在Android中是由LightRefBase来提供的,看下内容:

一个类只要继承LightRefBase,然后配合sp就可以使用智能指针的功能了。sp后面会单独介绍。

从这儿可以看出来,轻量级指针主要是在类里面添加了一个原子变量作为计数变量,然后通过incStrong和decStrong来实现计数的增减。

这儿有一个细节是这个计数可能会在多个线程里面访问,因此就会出现并发问题。比如一个对象对应的多个智能指针在多个线程里面使用,这时候就需要某个机制可以保证计数的准确。具体的策略就在incStrong和decStong里面,可以看到主要是使用了原子操作,并指定了内存序。这样通过内存屏障手段实现了不用持锁也能实现一致性。

接下来看下sp,一个类继承了LightRefBase后就拥有了智能指针计数机制,然后通过sp来操作指针才能实现智能管理内存的效果:

可以看到sp定义了对指针的基本操作,并通过m_ptr保存所管理的对象指针,看下构造和析构方法:

初始化m_ptr,然后调用incStrong增加计数,其实就是调用LightRefBase的incStrong,再看下移动拷贝构造函数:

移动只涉及拥有权的转移,因此不能更新计数。

其他构造函数也类似,再看下析构函数:

析构就是减少计数,调用LightRefBase的decStrong,看下对应的实现:

对计数减1,如果计数已经是1了,难么减少后就是0,就需要调用下析构,把对象释放掉。

强指针和弱指针对应的结构都是RefBase:

可以看到对于强指针,并不是简单用一个原子变量来计数了,而是使用了weakref_impl,这是一个weakref_type类型,定义如下:

可以看到RefBase提供了更多的能力,一个类继承了RefBase就可以通过强指针和弱指针来使用了。强指针就是前面提到的sp,关键的还是incStrong和decStrong,现在再看下流程, 对于sp的incStorng,调用的是RefBase的incStrong

可以看到先增加了弱引用,然后又添加了强引用,不过这儿并不是增加计数,而是记录引用指针,接下来才是增加计数,如果不是首次增加就直接返回了,否则会调用onFirstRef。这样如果有类想在第一次被引用的时候做些逻辑就可以使用这个机制了。

接下来看下incWeak和addStrongRef:

看到这儿基本就把添加引用流程走完了,从这儿也可以看出来弱引用计数一定大于等于强引用计数。

再看下decStrong,调用的也是RefBase的decStrong

可以看到decStrong中的逻辑主要就是操作强引用计数和弱引用计数。再看下移除引用和减少弱引用的实现:

再看下减少弱引用实现:

到了这儿decStrong流程就结束了,主要就是减少强弱引用计数的值,并且在引用计数为0时按照对象管理策略进行析构对象。

再看下弱指针的实现,弱指针比较复杂一些:

可以看到2点:

m_ptr 保存对象指针,m_refs负责计数,看下createWeak的实现:

再看下析构:

再看下promote:

通过attemptIncStrong尝试修改强引用计数:

到了这儿关于弱指针的内容也介绍完了。

最后画一个图总结下轻量级指针,强指针,弱指针的关系:

android 的对象是指针吗

Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析

1、Android

系统的运行时库层代码是用C++来编写的,用C++来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃。不过系统提供了智能指针,避免出现上述问题;

2、在使用C++来编写代码的过程中,指针使用不当造成内存泄漏一般就是因为new了一个对象并且使用完之后,忘记了delete这个对象,而造成系统崩溃。一般就是因为一个地方delete了这个对象之后,其它地方还在继续使原来指向这个对象的指针。

3、为了避免出现上述问题,一般的做法就是使用引用计数的方法,每当有一个指针指向了一个new出来的对象时,就对这个对象的引用计数增加1,每当有一个指针不再使用这个对象时,就对这个对象的引用计数减少1,每次减1之后,如果发现引用计数值为0时,那么,就要delete这个对象了,这样就避免了忘记delete对象或者这个对象被delete之后其它地方还

在使用的问题了。

4、如何实现这个对象的引用计数呢?肯定不是由开发人员来手动地维护了,要开发人员时刻记住什么时候该对这个对象的引用计数加1,什么

时候该对这个对象的引用计数减1,一来是不方便开发,二来是不可靠,一不小心哪里多加了一个1或者多减了一个1,就会造成灾难性的后果。

5、智能指针是一个对象,不过这个对象代表的是另外一个真实使用的对象,当智能指针指向实际对象的时候,就是智能指针对象创建的时候,当智能指针不再指向实际对象的时候,就是智能指针对象销毁的时候。在C++中,对象的创建和销毁时会分别自动地调用对象的构造函数和析构函数,负责对真实对象的引用计数加1和减1的工作就落实到智能指针对象的构造函数和析构函数的身上了,这也是为什么称这个指针对象为智能指针的原因。


当前文章:android指针,安卓 指针
网站链接:http://cxhlcq.com/article/dscdigp.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部