首页 文章 精选 留言 我的

精选列表

搜索[代码生成],共10000篇文章
优秀的个人博客,低调大师

iOS-《编写高质量代码》笔记 第三章-内存管理

建议17:理解内存和Objective-C内存管理规则 OC 内存管理模式基于对象的“所有权”上。任何对象都会被一个或多个使用者引用,只要对象还有一个使用者,该对象就应该继续存在。如果一个对象没有使用者了,系统将自动销毁它。 建议18:内存管理讲究“好借好还,再借不难” 在返回一个新创建的(拥有的)对象时,应该使用autorelease而不是release来释放所有权。 建议19:区别开alloc 、init、retain、release、和dealloc 之间的差异 OC 中没有new和delete 两个关键字,new可以作为一个函数,也就是alloc + init 。 alloc分配过程不仅进行对象的内存分配,而且还初始化对象的两个非常重要属性,即它的isa实例变量和保持数(引用计数) 。它还将所有的剩下的实例变量设置为0。但是分配完成的对象还是不可用,还需要调用像init这样的初始化方法来进行对象自有的初始化,才能返回一个可用的对象。 建议20:优先使用存取方法来简化内存管理 使用存取方法(getter ,setter)管理内存,可大大降低管理方面出现的问题。 建议21:对象销毁或者移除一定考虑所有权的释放 从集合中移除对象,集合要释放对被移除对象的所有权。(自动释放) 建议22:明智而审慎地使用dealloc dealloc 的角色就是释放对象占用的内存并处理自己所拥有的资源,包括本身变量的释放。 不要尝试用dealloc管理系统资源。应用程序终止时,对象的dealloc可能不会被调用。因为进程的内存是自动清除退出,让操作系统清理资源比调用所有的内存管理方法更有效率。

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

Android应用程序组件Content Provider的启动过程源代码分析(2)

Step 5.ActivityThread.getProvider 这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中: publicfinalclassActivityThread{ ...... privatefinalIContentProvidergetExistingProvider(Contextcontext,Stringname){ synchronized(mProviderMap){ finalProviderClientRecordpr=mProviderMap.get(name); if(pr!=null){ returnpr.mProvider; } returnnull; } } ...... privatefinalIContentProvidergetProvider(Contextcontext,Stringname){ IContentProviderexisting=getExistingProvider(context,name); if(existing!=null){ returnexisting; } IActivityManager.ContentProviderHolderholder=null; try{ holder=ActivityManagerNative.getDefault().getContentProvider( getApplicationThread(),name); }catch(RemoteExceptionex){ } IContentProviderprov=installProvider(context,holder.provider, holder.info,true); ...... returnprov; } ...... } 这个函数首先会通过getExistingProvider函数来检查本地是否已经存在这个要获取的ContentProvider接口,如果存在,就直接返回了。本地已经存在的ContextProvider接口保存在ActivityThread类的mProviderMap成员变量中,以ContentProvider对应的URI的authority为键值保存。在我们这个情景中,因为是第一次调用ArticlesProvider接口,因此,这时候通过getExistingProvider函数得到的IContentProvider接口为null,于是下面就会调用ActivityManagerService服务的getContentProvider接口来获取一个ContentProviderHolder对象holder,这个对象就包含了我们所要获取的ArticlesProvider接口,在将这个接口返回给调用者之后,还会调用installProvider函数来把这个接口保存在本地中,以便下次要使用这个ContentProvider接口时,直接就可以通过getExistingProvider函数获取了。 我们先进入到ActivityManagerService服务的getContentProvider函数中看看它是如何获取我们所需要的ArticlesProvider接口的,然后再返回来看看installProvider函数的实现。 Step 6.ActivityManagerService.getContentProvider 这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中: publicfinalclassActivityManagerServiceextendsActivityManagerNative implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{ ...... publicfinalContentProviderHoldergetContentProvider( IApplicationThreadcaller,Stringname){ ...... returngetContentProviderImpl(caller,name); } ...... } 它调用getContentProviderImpl函数来进一步执行操作。 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966982,如需转载请自行联系原作者

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

Hapdoop的一个Mapreduce示例代码--统计单词个数有排序功能

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 package com.mzsx.hadoop; import java.io.IOException; import java.util.Random; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.WritableComparable; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class MySortWordCount { public static class MyMapper extends Mapper<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable( 1 ); // 类似于int类型 private Text word = new Text(); // 可以理解成String类型 public void map(Object key, Text value, Context context) throws IOException, InterruptedException { System.err.println(key + "," + value); // 默认情况下即根据空格分隔字符串 String tmp=value.toString(); tmp=tmp.replace( '\'' , ' ' ); tmp=tmp.replace( '.' , ' ' ); tmp=tmp.replace( ',' , ' ' ); tmp=tmp.replace( ':' , ' ' ); tmp=tmp.replace( '!' , ' ' ); tmp=tmp.replace( ';' , ' ' ); tmp=tmp.replace( '?' , ' ' ); tmp=tmp.replace( '`' , ' ' ); tmp=tmp.replace( '"' , ' ' ); tmp=tmp.replace( '&' , ' ' ); tmp=tmp.replace( '(' , ' ' ); tmp=tmp.replace( ')' , ' ' ); tmp=tmp.replace( '-' , ' ' ); StringTokenizer itr = new StringTokenizer(tmp); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } }; } // Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT> public static class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { System.err.println(key + "," + values); int sum = 0 ; for (IntWritable val : values) { sum += val.get(); } result.set(sum); ; context.write(key, result); // 这是最后结果 }; } public static class SortMapper extends Mapper<Object, Text, IntWritable,Text>{ public void map(Object key, Text value, Context context) throws IOException, InterruptedException { IntWritable times = new IntWritable( 1 ); Text password = new Text(); String eachline=value.toString(); String[] eachterm =eachline.split( "\t" ); password.set(eachterm[ 0 ]); times.set(Integer.parseInt(eachterm[ 1 ])); context.write(times,password); } } public static class SortReducer extends Reducer<IntWritable,Text,IntWritable,Text> { private Text password = new Text(); public void reduce(IntWritable key,Iterable<Text> values, Context context) throws IOException, InterruptedException { for (Text val : values) { password.set(val); context.write(key,password); } } } private static class IntDecreasingComparator extends IntWritable.Comparator { public int compare(WritableComparable a, WritableComparable b) { //return -super.compare(a, b); return super .compare(a, b); } public int compare( byte [] b1, int s1, int l1, byte [] b2, int s2, int l2) { //return -super.compare(b1, s1, l1, b2, s2, l2); return super .compare(b1, s1, l1, b2, s2, l2); } } public static void main(String[] args) throws Exception { // 声明配置信息 Configuration conf = new Configuration(); // 声明Job Job job = new Job(conf, "Word Count" ); // 设置工作类 job.setJarByClass(MySortWordCount. class ); // 设置mapper类 job.setMapperClass(MyMapper. class ); // 可选 job.setCombinerClass(MyReducer. class ); // 设置合并计算类 job.setReducerClass(MyReducer. class ); // 设置key为String类型 job.setOutputKeyClass(Text. class ); // 设置value为int类型 job.setOutputValueClass(IntWritable. class ); //job.setInputFormatClass(KeyValueTextInputFormat.class); // 设置或是接收输入输出 /*FileInputFormat.setInputPaths(job, new Path("/user/root/aoman.txt")); FileOutputFormat.setOutputPath(job, new Path("/user/root/r3")); // 执行 System.exit(job.waitForCompletion(true) ? 0 : 1);*/ //定义一个临时目录,先将词频统计任务的输出结果写到临时目录中, 下一个排序任务以临时目录为输入目录。 FileInputFormat.addInputPath(job, new Path( "/user/root/aoman.txt" )); Path tempDir = new Path( "MySortWordCount-temp-" + Integer.toString( new Random().nextInt(Integer.MAX_VALUE))); FileOutputFormat.setOutputPath(job, tempDir); if (job.waitForCompletion( true )) { Job sortJob = new Job(conf, "csdnsort" ); sortJob.setJarByClass(MySortWordCount. class ); FileInputFormat.addInputPath(sortJob, tempDir); sortJob.setMapperClass(SortMapper. class ); FileOutputFormat.setOutputPath(sortJob, new Path( "/user/root/sort1" )); sortJob.setOutputKeyClass(IntWritable. class ); sortJob.setOutputValueClass(Text. class ); sortJob.setSortComparatorClass(IntDecreasingComparator. class ); FileSystem.get(conf).deleteOnExit(tempDir); System.exit(sortJob.waitForCompletion( true ) ? 0 : 1 ); } System.exit(job.waitForCompletion( true ) ? 0 : 1 ); } } 版权声明:原创作品,如需转载,请注明出处。否则将追究法律责任 本文转自 梦朝思夕 51CTO博客,原文链接:http://blog.51cto.com/qiangmzsx/1404661

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

Android应用程序组件Content Provider的启动过程源代码分析(7)

函数installProvider执行完成以后,返回到Step 16中的instalContentProviders函数中,执行下面语句: try{ ActivityManagerNative.getDefault().publishContentProviders( getApplicationThread(),results); }catch(RemoteExceptionex){ } 前面已经提到,这个函数调用的作用就是通知ActivityMangerService,需要在这个进程中加载的Content Provider已经完加载完成了,参数results就包含了这些已经加载好的Content Provider接口。 Step 21. ActivityMangerService.publishContentProviders 这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中: publicfinalclassActivityManagerServiceextendsActivityManagerNative implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{ ...... publicfinalvoidpublishContentProviders(IApplicationThreadcaller, List<ContentProviderHolder>providers){ ...... synchronized(this){ finalProcessRecordr=getRecordForAppLocked(caller); ...... finalintN=providers.size(); for(inti=0;i<N;i++){ ContentProviderHoldersrc=providers.get(i); if(src==null||src.info==null||src.provider==null){ continue; } ContentProviderRecorddst=r.pubProviders.get(src.info.name); if(dst!=null){ mProvidersByClass.put(dst.info.name,dst); Stringnames[]=dst.info.authority.split(";"); for(intj=0;j<names.length;j++){ mProvidersByName.put(names[j],dst); } intNL=mLaunchingProviders.size(); intj; for(j=0;j<NL;j++){ if(mLaunchingProviders.get(j)==dst){ mLaunchingProviders.remove(j); j--; NL--; } } synchronized(dst){ dst.provider=src.provider; dst.app=r; dst.notifyAll(); } ...... } } } } ...... } 在我们这个情景中,只有一个Content Provider,因此,这里的N等待1。在中间的for循环里面,最重要的是下面这个语句: ContentProviderRecorddst=r.pubProviders.get(src.info.name); 从这里得到的ContentProviderRecord对象dst,就是在前面Step 7中创建的ContentProviderRecord对象cpr了。在for循环中,首先是把这个Content Provider信息保存好在mProvidersByClass和mProvidersByName中: mProvidersByClass.put(dst.info.name,dst); Stringnames[]=dst.info.authority.split(";"); for(intj=0;j<names.length;j++){ mProvidersByName.put(names[j],dst); } 前面已经说过,这两个Map中,一个是以类名为键值保存Content Provider信息,一个是以authority为键值保存Content Provider信息。 因为这个Content Provider已经加载好了,因此,把它从mLaunchingProviders列表中删除: intNL=mLaunchingProviders.size(); intj; for(j=0;j<NL;j++){ if(mLaunchingProviders.get(j)==dst){ mLaunchingProviders.remove(j); j--; NL--; } } 最后,设置这个ContentProviderRecord对象dst的provider域为从参数传进来的Content Provider远程接口: synchronized(dst){ dst.provider=src.provider; dst.app=r; dst.notifyAll(); } 执行了dst.notiryAll语句后,在Step 7中等待要获取的Content Provider接口加载完毕的线程就被唤醒了。唤醒之后,它检查本地ContentProviderRecord变量cpr的provider域不为null,于是就返回了。它最终返回到Step 5中的ActivityThread类的getProvider函数中,继续往下执行: IContentProviderprov=installProvider(context,holder.provider, holder.info,true); 注意,这里是在Article应用程序中进程中执行installProvider函数的,而前面的Step 17的installProvider函数是在ArticlesProvider应用程序进程中执行的。 Step 22. ActivityThread.installProvider 这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中: publicfinalclassActivityThread{ ...... privatefinalIContentProviderinstallProvider(Contextcontext, IContentProviderprovider,ProviderInfoinfo,booleannoisy){ ...... if(provider==null){ ...... }elseif(localLOGV){ ...... } synchronized(mProviderMap){ //Cachethepointerfortheremoteprovider. Stringnames[]=PATTERN_SEMICOLON.split(info.authority); for(inti=0;i<names.length;i++){ ProviderClientRecordpr=newProviderClientRecord(names[i],provider, localProvider); try{ provider.asBinder().linkToDeath(pr,0); mProviderMap.put(names[i],pr); }catch(RemoteExceptione){ returnnull; } } ...... } returnprovider; } ...... } 同样是执行installProvider函数,与Step 17不同,这里传进来的参数provider是不为null的,因此,它不需要执行在本地加载Content Provider的工作,只需要把从ActivityMangerService中获得的Content Provider接口保存在成员变量mProviderMap中就可以了。 这样,获取与"shy.luo.providers.artilces"这个uri对应的Content Provider(shy.luo.providers.articles.ArticlesProvider)就完成了,它同时也是启动Content Provider的完整过程。第三方应用程序获得了这个Content Provider的接口之后,就可以访问它里面的共享数据了。在下面一篇文章中,我们将重点分析Android应用程序组件Content Provider在不同进程中传输数据的过程,即Content Provider在不同应用程序中共享数据的原理,敬请关注。 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966990,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

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

用户登录
用户注册