首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

iOS开发-沙盒(sandbox)机制

苹果前天发的财报,貌似现在用ios系统的比以前又多了一些,但是大家的iPhone购买的渠道也是五花八门,有的从非正规渠道购买的iPhone里的操作系统已经被越狱过,越狱这个事情和Android的root刷机是是一样的,正常情况下大家用手机都是没问题的。不过有些人总是觉得iOS和Android各种用的不爽,需要管理员权限,不过凡事有利有弊,以前有人买苹果刷机是因为输入法。现在输入法问题解决了,还是有人越狱,花几千大洋买个iPhone然后越狱,这种事情想想都很。。 Android系统中应用程序安装后,系统会为其分配一个独立的存储空间(Security Sandbox),存放字节码文件、资源文件及配置文件,同时为应用程序分配唯一的ID,标识应用程序的相关文件和资源,系统通过设置权限从而实现一个应用程序在一般情况下只能访问该应用程序的文件和资源。iOS操作系统差不多类似,iOS是从苹果的next操作系统发展过来的,next是一款类unix操作系统,unix系统对于文件权限的限制非常严格,正常情况下普通用户常用的操作根本用不到root权限,用户的操作请求假如是已分配权限,自然可以执行,反之需要root权限的话就不被允许。对于应用程序而言也是同样的,分配一个空间,然后只有允许的权限才能访问内容。 下面是张苹果官网以前关于沙盒方面的图片: 上面这个图就是常说的每个应用程序都有自己的存储空间,应用程序不能翻过自己的围墙去访问别的存储空间的内容,应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。其实简单理解每个应用都是其独立的分配空间,比如说如果360可以访问QQ聊天的内容,那么估计Pony就破产了~ sandbox的启用流程:①sandbox_init 通过libsandbox.dylib转换为二进制传递给kernelmac syscallTrustedBSD ②将sandbox_init 的请求发sandbox.kext 的扩展(看到这里会想到IIS扩展), 扩展为当前进程安装证书,然后返回安装结果.③如果安装成功,每次进程的请求,都会被trusted bsd 发送给sandbox.kext 去匹配之前安装的证书规则。如果证书不匹配的话,则安装失败。 为了看下xCode模拟器中启动的Demo路径和类型,可以进行接下来的操作,在 viewDidLoad加一句话: 1 NSLog (@ "路径:%@" , NSHomeDirectory ()); 这个时候会看到一个路径,测试生成结果: 1 路径:/Users/用户名/Library/Developer/CoreSimulator/Devices/C53A5D69-DEDD-4598-9297-79B811E14DAD/data/Containers/Data/Application/0FCDA696-03B4-4D8D-B99B-E94D1F843561 打开Finder是没法找到这个路径的,需要在终端中输入命令显示隐藏文件: 终端中显示隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true 终端中不显示隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false 模拟器的信息在CoreSimulator中: 路径比较长,之后是模拟器型号,模拟器的具体信息: 之后在Data中可以看到具体应用信息,和一个应用包括的目录信息: Documents目录存储的是程序中创建的或在程序中浏览到的文件数据,Library存储程序的默认设置或其它 状态信息;Library下的Caches目录存放缓存文件,Library下的Preferences目录存放的应用程序的偏好设置,tmp保存的是创建和存放的临时文件,以上路径也可以通过程序获取路径viewDidLoad中加入以下代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 //获取Documents文件夹目录,NSDocumentDirectory获取Doucments文件夹目录,NSUserDomainMask是在当前应用沙盒中获取,所有应用沙盒目录组成一个数组结构的数据存放 NSArray *documentPath = NSSearchPathForDirectoriesInDomains ( NSDocumentDirectory , NSUserDomainMask , YES ); NSLog (@ "Documents目录:%@" ,[documentPath objectAtIndex:0]); //缓存Cache目录 NSArray *cachePath = NSSearchPathForDirectoriesInDomains ( NSCachesDirectory , NSUserDomainMask , YES ); NSLog (@ "缓存目录:%@" ,[cachePath objectAtIndex:0]); //Library目录 NSArray *domainPath = NSSearchPathForDirectoriesInDomains ( NSLibraryDirectory , NSUserDomainMask , YES ); NSLog (@ "资源库目录:%@" ,[domainPath objectAtIndex:0]); //临时文件temp目录 NSLog (@ "临时文件目录:%@" , NSTemporaryDirectory ()); 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4257394.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android开发——内存优化 图片处理

8. 用缓存避免内存泄漏 很常见的一个例子就是图片的三级缓存结构,分别为网络缓存,本地缓存以及内存缓存。在内存缓存逻辑类中,通常会定义这样的集合类。 [java] view plain copy privateHashMap<String,Bitmap>mMemoryCache=newHashMap<String,Bitmap>();//String类为该图片对应url 三级缓存结构过程介绍: 在用户切换到展示图片的界面时,当然是优先判断内存缓存是否为Null,不为空直接展示图片,若为空,同样的逻辑去判断本地缓存(不为空便设置内存缓存并展示图片),本地缓存再为空才会根据该图片的url用网络下载类去下载该图片并展示图片(当然了,下载到图片后会有设置本地缓存以及内存缓存的操作)。 内存泄漏的问题就出现在内存缓存中:只要HashMap对象实例被引用,而Bitmap对象又都是强引用,Bitmap中图片越来越多,即便是内存溢出了,垃圾回收器也不会处理。 解决方案: (1)我们可以选择使用软引用,从而在内存不足时,垃圾回收器更容易回收Bitmap垃圾。 [java] view plain copy privateHashMap<String,SoftReference<Bitmap>>mMemoryCache=newHashMap<String,SoftReference<Bitmap>>(); (2)Android2.3以后,SoftReference不再可靠。垃圾回收期更容易回收它,不再是内存不足时才回收软引用。那么缓存机制便失去了意义。 Google官方建议使用LruCache作为缓存的集合类。其实内部封装了LinkedHashMap。内部原理是一直判断集合大小是否超出给定的最大值,超出就把最早最少使用的对象踢出集合。 [java] view plain copy privateLruCache<String,Bitmap>mMemoryCache=newLruCache<String,Bitmap> ((int)(Runtime.getRuntime().maxMemory()/8)){ //用最大内存的1/8分配给这个集合使用 //让这个集合知道每个图片的大小 @Override protectedintsizeOf(Stringkey,Bitmapvalue){ intbyteCount=value.getRowBytes()*value.getHeight();//计算图片大小,每行字节数*高度 returnbyteCount; } }; 9. 优化Bitmap避免内存泄漏 Android中很多控件比如ListView/GridView/ViewPaper通常都会包含很多图片,特别是快速滑动的时候可能加载大量的图片,因此对图片进行优化处理显得尤为重要。 9.1 图片质量压缩 [java] view plain copy publicstaticBitmapcompressImage(Bitmapbitmap){ ByteArrayOutputStreambaos=newByteArrayOutputStream(); //质量压缩方法,参数100表示不压缩,把压缩后的数据存放到baos中 bitmap.compress(Bitmap.CompressFormat.JPEG,100,baos); intoptions=100; //循环判断如果压缩后图片大小>50kb就继续压缩 while(baos.toByteArray().length/1024>50){ //清空baos baos.reset(); bitmap.compress(Bitmap.CompressFormat.JPEG,options,baos); options-=10;//每次都减少10 } //把压缩后的数据baos存放到ByteArrayInputStream中 ByteArrayInputStreamisBm=newByteArrayInputStream(baos.toByteArray()); //把ByteArrayInputStream数据生成图片 BitmapnewBitmap=BitmapFactory.decodeStream(isBm,null,null); returnnewBitmap; } 9.2 图片尺寸裁剪 如果说没有裁剪,下载下来是200*200,而ImageView本身是100*100的,具体原因可以参考这篇文章,这样就浪费了一部分内存。 使用BitmapFactory.Options设置inSampleSize就可以缩小图片。如果该值为2,则缩略图的宽和高都是原始图片的1/2,图片的大小就为原始大小的1/4(小于等于1不缩放)。具体方法如下: 既然有了inSampleSize的概念,我们就要对比实际图片大小和ImageView控件的大小,如果使用内存直接处理实际图片的Bitmap从而得到实际大小的话,就失去了图片尺寸裁剪的意义,因为内存已经被消耗了。因此BitmapFactory.Options提供了inJustDecodeBounds标志位,当它被设置为true后,再使用decode系列方法时,并不会真正的分配内存空间,这样解码出来的Bitmap为null,但是可以计算出原始图片的真实宽高,即options.outWidth和options.outHeight。通过这两个值,就可以知道图片是否过大了。 [java] view plain copy BitmapFactory.Optionsoptions=newBitmapFactory.Options(); options.inJustDecodeBounds=true; BitmapFactory.decodeResource(getResources(),R.id.myimage,options); intimageHeight=options.outHeight; intimageWidth=options.outWidth; StringimageType=options.outMimeType; 这里提供了一个calculateInSampleSize()工具方法来帮我们根据实际情况动态计算合适的inSampleSize。 [java] view plain copy publicstaticintcalculateInSampleSize(//参2和3为ImageView期待的图片大小 BitmapFactory.Optionsoptions,intreqWidth,intreqHeight){ //图片的实际大小 finalintheight=options.outHeight; finalintwidth=options.outWidth; //默认值 intinSampleSize=1; //动态计算inSampleSize的值 if(height>reqHeight||width>reqWidth){ finalinthalfHeight=height/2; finalinthalfWidth=width/2; while((halfHeight/inSampleSize)>=reqHeight&&(halfWidth/inSampleSize)>=reqWidth){ inSampleSize*=2; } } returninSampleSize; } 创建一个完整的缩略图方案: [java] view plain copy publicstaticBitmapdecodeSampledBitmapFromResource(Resourcesres,intresId, intreqWidth,intreqHeight){ finalBitmapFactory.Optionsoptions=newBitmapFactory.Options(); options.inJustDecodeBounds=true; BitmapFactory.decodeResource(res,resId,options); //计算inSampleSize,因为前面已经设置过标志位并调用了decode方法,所以参数option包含了真实宽高信息 options.inSampleSize=calculateInSampleSize(options,reqWidth,reqHeight); //别忘记将opts.inJustDecodeBound设置回false,否则获取的bitmap对象还是null options.inJustDecodeBounds=false; //重新加载图片 returnBitmapFactory.decodeResource(res,resId,options); } 当我们在使用ImageView进行设置图片资源时: [java] view plain copy mImageView.setImageBitmap(//ImageView所期望的图片大小为100*100像素 decodeSampledBitmapFromResource(getResources(),R.id.myimage,100,100)); 9.3 改变图片颜色模式 Android默认的颜色格式是ARGB_8888,在不要求透明度的情况下可以改成RGB_565,这样每个像素占用的内从可从4byte将为2byte。 一张分辨率为1920x1080的图片,如果Bitmap使用ARGB_8888格式显示的话,占用的内存将是1920x1080x4个字节,将近8M内存。 10. 及时回收资源 (1)当界面不可见时我们应当将所有和界面相关的资源进行释放。 我们可以在Activity中重写onTrimMemory()方法,通过switch这个方法中的level参数,判断它是不是等于TRIM_MEMORY_UI_HIDDEN,就说明用户已经离开了我们的程序,此时就可以进行UI相关资源释放操作了,如下所示: [java] view plain copy @Override publicvoidonTrimMemory(intlevel){ super.onTrimMemory(level); switch(level){ caseTRIM_MEMORY_UI_HIDDEN: //进行资源释放操作 break; } } 比如Android3.0开始支持的属性动画中有一类无限循环的动画,它会通过View间接持有Activity的引用,如果没有在onDestroy中停止动画(animator.cancel()),就会泄漏当前的Activity。说起动画,还有一点就是减少帧动画的使用。 (2)Google也建议在onStop()方法中释放资源,但是和上面的释放UI资源是有区别的,因为onStop()方法只是当一个Activity不可见的时候就会调用,比如说用户打开了我们程序中的另一个ActivityB。在onStop()方法中适合去关闭一些读写文件的资源、数据库操作相关的资源等等。 但是像UI相关的资源应该一直要等到onTrimMemory(TRIM_MEMORY_UI_HIDDEN)这个回调之后才去释放,否则从ActivityB回到ActivityA,UI相关的资源会重新加载。 至此关于Android内存泄漏的内容总结完毕。 本文转自 一点点征服 博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/6692174.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

【Android开发坑系列】之事件

总结一下: 1.Touch事件分发中只有两个主角: ViewGroup和View。 ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三个相关事件。View包含dispatchTouchEvent、onTouchEvent两个相关事件。其中ViewGroup又继承于View。 2.触摸事件由Action_Down、Action_Move、Aciton_UP组成,其中一次完整的触摸事件中,Down和Up都只有最多一个,Move有若干个,可以为0个。定律:当dispatchTouchEvent在进行事件分发的时候,只有前一个action返回被处理(消费)掉,才会触发后一个action。 3.事件传递的两种方式:隧道方式:从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递;冒泡方式:从最内层子元素依次往外传递直到根元素或在中间某一元素中由于某一条件停止传递。 dispatchTouchEvent是隧道方式,onTouchEvent是冒泡方式(若返回true,则上层不再处理)。 4.onInterceptTouchEvent有两个作用: 拦截Down事件的分发; 中止Up和Move事件向目标View传递,使得目标View所在的ViewGroup捕获Up和Move事件。 参考:http://blog.csdn.net/liutao5757124/article/details/6097125 本文转自Kai的世界,道法自然博客园博客,原文链接:http://www.cnblogs.com/kaima/p/4788625.html,如需转载请自行联系原作者。

优秀的个人博客,低调大师

【Android开发坑系列】之PopupWindow

PopupWindow在4.0之前的版本有个系统级别的BUG,必须借助一段自定义的fix代码来修复。其中mPopPm就是PopupWindow实例。java.lang.NullPointerExceptionat android.widget.PopupWindow$1.onScrollChanged if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { try { final Field fAnchor = PopupWindow.class.getDeclaredField("mAnchor"); fAnchor.setAccessible(true); Field listener = PopupWindow.class.getDeclaredField("mOnScrollChangedListener"); listener.setAccessible(true); final ViewTreeObserver.OnScrollChangedListener originalListener = (ViewTreeObserver.OnScrollChangedListener) listener .get(mPopPm); ViewTreeObserver.OnScrollChangedListener newListener = new ViewTreeObserver.OnScrollChangedListener() { public void onScrollChanged() { try { View mAnchor = (View) fAnchor.get(mPopPm); if (mAnchor == null) { return; } else { originalListener.onScrollChanged(); } } catch (Exception e) { e.printStackTrace(); } } }; listener.set(mPopPm, newListener); } catch (Exception e) { e.printStackTrace(); } 在生成popupWindow的父Activity销毁之前,需要销毁popupWindow。否则会报内存泄露(leak)。也即在Activity的onDestroy()执行如下代码: if (mPopupWindow != null) { mPopupWindow.dismiss(); mPopupWindow = null; } 在<=2.3的系统上,慎用setFocusable(boolean),一般设为mPopPm.setFocusable(false) 本文转自Kai的世界,道法自然博客园博客,原文链接:http://www.cnblogs.com/kaima/p/3160897.html,如需转载请自行联系原作者。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册