BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); bitmapOptions.inSampleSize = 4; bitmap = BitmapFactory.decodeStream(this.getContentResolver()..openInputStream(uri), null , bitmapOptions);
if (bitmap != null && !bitmap.isRecycled()) bitmap.recycle();
介绍一下图片占用进程的内存算法吧。
android中处理图片的基础类是Bitmap,顾名思义,就是位图。占用内存的算法如下:
图片的width*height*Config。
如果Config设置为ARGB_8888,那么上面的Config就是4。一张480*320的图片占用的内存就是480*320*4 byte。
前面有人说了一下8M的概念,其实是在默认情况下android进程的内存占用量为16M,因为Bitmap他除了java中持有数据外,底层C++的skia图形库还会持有一个SKBitmap对象,因此一般图片占用内存推荐大小应该不超过8M。这个可以调整,编译源代码时可以设置参数。
// Eliminate extra GCs during startup by setting the initial heap size to 4MB. // TODO: We should restore the old heap size once the activity reaches the idle state VMRuntime.getRuntime().setMinimumHeapSize(INITIAL_HEAP_SIZE);
继门户网站、QQ软件广告一度被屏蔽之后,尚在成长中的App开发者也遭遇了同样的烦恼。
近日,金山网络推出了其手机安全产品——手机毒霸Android版,拦截应用内置广告是其主打的卖点之一。不过,在应用中加入广告是移动互联网最主要的盈利模式。手机毒霸的这一功能在上周遭到了App开发商和广告代理商的强烈反对。
有法律界人士表示,金山网络此举涉嫌不正当竞争,但是,对于金山网络所指的“恶意广告”难以鉴定将是App开发商维权的难点。
而有下载过手机毒霸的用户则向《每日经济新闻》记者表示,既然应用开发者可以开发App广告,用户也有选择屏蔽的权利,“没有那些恶意弹出的广告,用户体验也会好很多”。
威胁App开发商生存
9月14日上午,多盟、触控科技等19家App开发商和广告代理商发布声明,称金山网络的手机毒霸产品拦截App应用内所有广告,威胁开发者基本生存,挑战移动互联网基本商业模式。
该声明还称,一旦用户使用了手机毒霸,毒霸会试图获取用户手机root权限,直接篡改开发者的App,侵犯开发者的合法权益。同时,手机毒霸不区分广告形式,全部予以屏蔽,连用户认可的Banner等成熟的广告形式也都一律屏蔽,全国空气污染指数中的广告也被毒霸拦截。
但是,这一说法遭到了金山网络的反对,该公司相关人士向记者表示,手机毒霸并不是针对所有广告,而是针对一些恶意广告对用户的骚扰。“体验好的广告我们并不会拦截,相信不会引起开发者的反感。”
与 “让用户上网免受恶意广告打扰”相对应的是,这些广告是移动互联网行业主要收入来源之一。
帷千动媒CEO谢大新在接受《每日经济新闻》记者采访时透露:“现在暂时还没有很大的影响,之所以发这个声明,主要是出于对行业未来发展的考虑。”
中国互联网络信息中心统计报告显示,截至今年6月底,中国网民数量达到5.38亿,其中手机网民达到3.88亿,手机首次超越电脑成为第一大上网终端。
艾瑞咨询数据显示,2012年中国移动互联网市场规模将达976亿元,同比增长148.3%.移动互联网行业的春天似乎正在来临。
或催生优秀收费应用
金山网络屏蔽各大移动应用平台广告的举措引起广泛热议。
有下载过手机毒霸的用户向记者表示,既然应用开发者可以开发App广告,用户也有选择屏蔽的权利,“如果以后没有那些恶意弹出的广告,用户体验也会好很多”。
对此,业内人士的态度则截然相反。豌豆荚一名创始人认为,金山毒霸只是想尽快找到一个占领用户手机的切入点,它的市场占有率目前还很小,所以不会对行业造成太大影响。
记者了解到,移动互联网的广告盈利目前并不理想。国外一家针对移动应用的营销平台Trademob调查显示,大概有40%左右的移动广告点击是由于误按或欺诈点击。而安全软件的拦截无疑会让广告主质疑移动互联网广告投资的效益,也可能会阻碍移动广告市场的发展。
知识产权法律师游云庭接受《每日经济新闻》记者采访时表示,金山网络的行为无可厚非,但是却忽略了其屏蔽的广告是其他企业盈利的主要来源。“金山涉嫌不正当竞争。但是目前很难界定它屏蔽的尺度,这些企业的抗议可能不会奏效,双方可能还是会用协商或合作的方式解决。”
公开数据显示,Android平台手机用户中,内嵌广告方式的接受度最高,比例达到36.5%,其次一次性下载付费的比例为30%,而对于道具付费的模式认可程度仅有17.6%.
一名移动互联网人士猜测,虽然没有办法阻止金山以及其他安全厂商的这种行为,但移动应用开发者可能已经意识到了单纯依赖广告盈利的风险,这会催生更多优秀的收费类应用。
Objective-C 2.0增加了class extensions用于解决两个问题:
Objective-C 2.0以前, 若要定义私有函数,通常是在实现文件中声明一个"Private" category:
@interface MyClass (Private)
- (id)awesomePrivateMethod;
@end
然而, 类的私用方法通常是希望实现在类的@implementation块中的,而不是像上面的Category的方法那样实现在独立的@implementation区块中。事实上,Category仅仅是弥补了Objective-C缺少public/private限定的不足。
真正的问题是Objective-C编译器会认为在Category中声明的方法将会在别处实现,所以编译器并不会尝试确认它们是不是真得都被实现了。也就是说,开发者声明的方法或属性,但有可能并未实现,而且编译器也不会有什么警告。编译会以为它们将在别的地方或独立的文件中实现。
使用class exteionsion,在其中声明的方法和属性的实现将放在class的@implementation区块中。否则,编译器就会报错。
// someClass.m @interface someClass () -(void)extend; @end @implementation someClass // 所有声明在头文件或父类中方法的实现 // 或者一些私有函数 -(void)extend { // implement private method here; } @end
公有可读、私有可写的属性(Publicly-Readable, Privately-Writeable Properties)
实现一个不可变(immutable)的数据结构通常有一个好处是外部代码不能用setter修改对象的状态。然而,可能又希望它在内部又是一个可写的属性。Class extensions可以做到这一点:在公共接口(类的声明中)中,开发者可以声明一个属性是只读的,随后在类扩展中声明为可写。这样,对外部代码而言,该属性将是只读的,而内部代码却可以使用它setter方法。
@interface MyClass : NSObject @property (retain, readonly) float value; @end // 私有的extension, 隐藏在主实现文件中. @interface MyClass () @property (retain, readwrite) float value; @end
Class extension常常被误解为一个匿名的category。它们的语法的确很相似。虽然都可以用来为一个现有的类添加方法和属性,但它们的目的和行为却是不同的。
参考: Apple Documenation
原文地址: Minutia on Objective-C Categories and Extensions
转载请注明出处: http://blog.csdn.net/horkychen