内存检查工具
1.xcode----product-----Analyze
内存泄漏隐患提示:Potential Leak of an object allocated on line ……
数据赋值隐患提示:The left operand of …… is a garbage value;
对象引用隐患提示:Reference-Counted object is used after it is released;
2.xcode---product----Profile----Leak
可看出是出现内存泄露的object 后面还能具体看出是哪个类的实例还可以点击leak工具的view视图布局方式的第三个按钮
3.xcode---product---Profile--Allocations
可以很容易的列出所有分配内存的点,这样我们可以按照分配内存大小来进行排序, 这样可以很容易的发现哪些点分配的内存最多,而且是持续分配,这样我们来针对性的分析这些持续分配较大内存的地方;此工具会显示出所有申请内存的地方,并统计申请的次数和大小; 从这个列表中可以找出内存申请次数最多且申请内存最大的语句;从而分析出哪些地方使用的内存最多,进而可以优化和改进;
内存泄漏问题博客 http://blog.sina.com.cn/s/blog_3e99b31301014d1d.html
Java事件机制包括三个部分:事件、事件监听器、事件源。其中事件类中包含事件源的实例,来标识事件的发出者;事件监听器类则包含了事件被触发时的响应函数,业务逻辑写在该响应函数中;而事件源则有一个事件监听器列表,当事件触发时,通知所有的监听者,采用的是观察者模式 (发布-订阅模式)。
1、事件类。一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息。
import java.util.EventObject; /** * @Title: ValueChangeEvent.java * @Package * @Description: * @author Mr.Simple bboyfeiyu@gmail.com * @date Apr 5, 2013 2:10:39 PM * @version V1.0 */ /** * 事件类,包含了事件源 * @ClassName: ValueChangeEvent * @Description: * @author Mr.Simple * @date Apr 5, 2013 2:12:37 PM * */ public class ButtonClickEvent extends EventObject { /** * 字段: */ private static final long serialVersionUID = 1L; // 事件源 private Object mSourceObject = null; private String mTag = ""; /** * 构造函数 * @param sObject */ public ButtonClickEvent(Object sObject){ super(sObject); mSourceObject = sObject; } /** * 构造函数 * @param sObject * @param tag */ public ButtonClickEvent(Object sObject, String tag){ super(sObject); mSourceObject = sObject; mTag = tag; } /** * 获取事件源 * (non-Javadoc) * @see java.util.EventObject#getSource() */ public Object getSource() { return mSourceObject; } /** * * @Title: setSource * @Description: 设置事件源 * @param obj * @return void * @throws */ public void setSource(Object obj) { mSourceObject = obj; } /** * * @Title: getTag * @Description: 获得tag * @return * @return String * @throws */ public String getTag(){ return mTag; } /** * * @Title: setTag * @Description: 设置tag * @param tag * @return void * @throws */ public void setTag(String tag) { mTag = tag; } }
2、事件监听器。实现java.util.EventListener接口,注册在事件源上,当事件源触发事件时,取得相应的监听器调用其内部的回调方法。
/** * * @ClassName: ButtonClickListenerInner * @Description: 内部类的写法 * @author Mr.Simple * @date Apr 5, 2013 2:41:02 PM * */ private static class ButtonClickListenerInner implements EventListener{ /** * * @Title: ItemClicked * @Description: 点击事件 * @param event * @return void * @throws */ public void ButtonClicked(ButtonClickEvent event ) { // 获取事件源 ButtonDemo source = (ButtonDemo)event.getSource(); System.out.println("内部静态监听类@_@ 你点击的是 : " + source.getItemString()) ; } }
3、事件源。事件触发的地方,由于事件源的某项属性或状态发生了改变(比如Button被单击等)导致某项事件发生。换句话说就是生成了相应的事件对象。因为事件监听器要注册在事件源上,所以事件源类中应该含有用来存储事件监听器的容器(List,Set等等)。
/** * * @ClassName: ListViewDemo * @Description: 事件源模拟类,采用的是观察者模式 * @author Mr.Simple * @date Apr 5, 2013 2:18:34 PM * */ public class ButtonDemo { // item文本文字 private String mItemName = ""; // 监听器哈希集合,可以注册多个监听器 private Set<EventListener> mClickListeners = null ; /** * 构造函数 * */ public ButtonDemo(){ // 监听器列表 mClickListeners = new HashSet<EventListener>(); mItemName = "Defualt Item Name"; } /** * 构造函数 * @param itemString */ public ButtonDemo(String itemString){ mItemName = itemString; mClickListeners = new HashSet<EventListener>(); } /** * * @Title: AddItemClickListener * @Description: 添加监听器 * @param listener * @return void * @throws */ public void AddItemClickListener(EventListener listener){ // 添加到监听器列表 this.mClickListeners.add(listener) ; } /** * * @Title: ItemClick * @Description: 模拟点击事件,触发事件则通知所有监听器 * @return void * @throws */ public void ButtonClick() { // 通知所有监听者 Notifies() ; } /** * * @Title: Notifies * @Description: 通知所有监听者 * @return void * @throws */ private void Notifies() { Iterator<EventListener> iterator = mClickListeners.iterator(); while (iterator.hasNext()) { // 获取当前的对象 ButtonClickListenerInner listener = (ButtonClickListenerInner) iterator.next(); // 事件触发,事件的构造函数参数为事件源 listener.ButtonClicked(new ButtonClickEvent(this)); } } /** * * @Title: getItemString * @Description: 返回该项的名字 * @return String * @throws */ public String getItemString() { return mItemName; } /** * * @Title: main * @Description: main方法 * @param args * @return void * @throws */ public static void main(String[] args) { ButtonDemo buttonDemo = new ButtonDemo("Hello, I am a ButtonDemo") ; // 添加监听器 buttonDemo.AddItemClickListener(new ButtonClickListenerInner()) ; // 事件触发 buttonDemo.ButtonClick(); }
输出结果如下 :
下载链接 : http://download.csdn.net/detail/bboyfeiyu/5222920
Xamarin是mono项目的一个分支,但这里面最大的区别Xamarin是商业项目.mono做为跨平台的框架已得到越来越多的商业项目的肯定,令外界担心的版权问题\可靠性\稳定性也得到证实,使用mono最大的好处是可以使用其它平台众多的项目,而不必被限制在windows平台下贫乏而又昂贵的各种.本人花一个星期的时间对Xamarin进行了解,并且尝试对它的环境进行配置,测试.从而写出本文.
本人去了解Xamarin的主要目的是为了移动项目跨平台寻找更优的开发方案.Xamarin官方号称在android\iphone\ipad\mac\windows phone\windows 8已实现跨平台,并且实现跨平台可以重用90%的代码.
根据从mono的跨平台实现原理,了解到Xamarin也是采用gtk#作为ui层,但令人沮丧的是Xamarin下的ui层并不能跨平台,具体原因不理解是为什么,我猜大概还是因为某些人为的限制,因为gtk做为跨平台的UI层在技术层早已不是问题.
Xamarin提供了试用版本,但是在线安装的形式,只因采用这个国度的网络,,两天没安装成功只得放弃这种方式,好在有好心人整理了离线安装的方式,通过离线安装方式安装成功.但很多功能不能使用,需要破解,,,为了更多地了解这个软件,我无耻地用破解工具破解掉了Xamarin...
Xamarin带了Xamarin studio,但只能做android下的开发,这是我比较纳闷的一点.
Xamarin还提供了for vs2010 vs2012的插件,这个是比较吸引人的地方.但插件里面只有android\ios类型的项目,更多其它平台上的项目都没有.ios的项目的编译和调试需要xcode支持,则说明还需要一台mac的系统以及xcode环境,以及一个装在mac上的辅助软件Xamarin.ios,Xamarin.ios是运行在mac上的软件,用来负责编译和调试软件,并且把结果通过socket通信反应到IDE上.但官方并没有提供这个软件的下载或试用.是购买授权用户的特权.
因此我的进一步了解中断了,但我已决定是放弃Xamarin的时候了,,当前用它做跨平台的项目还不成熟,主要体现在以下几个方面
毕竟是新项目,用户少,可用资源少,遇到问题要么自己硬啃,要么等几天的时间让官方技术支持帮解决
- 官方只提供了在线文档,在这个朝代访问国外网站的效率,你懂的.
- Xamarin是商业项目,并不开源,因此无法预测到那框架哪个部分会有bug,一旦框架出现问题,只能坐等官方更新.
- Xamarin的api更新总是要慢于智能手机系统提供商发布的api,说明你无法使用最新的api
- Xamarin是商业软件,要花钱,即便是调研它的可行性都很难,除非花钱买授权后再调研,没人这么有钱,没人这么闲
- 除了官方的说明,没看到有对android\ios\mac以外的开发资源与环境,这个是莫须有?