内存检查工具
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以外的开发资源与环境,这个是莫须有?