<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_清风细雨</title><subtitle type="text">               以淡定的态度进行技术型扯蛋！</subtitle><id>http://feed.cnblogs.com/blog/u/6203/rss</id><updated>2012-05-13T14:21:57Z</updated><author><name>轮回</name><uri>http://www.cnblogs.com/dreign/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dreign/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/6203/rss"/><entry><id>http://www.cnblogs.com/dreign/archive/2012/05/08/2490212.html</id><title type="text">.net 4种单例模式</title><summary type="text">本文介绍了C#下关于单例的4种实现方法。using System;using System.Collections.Generic;using System.Text;namespace SingletonDemo{ /// &lt;summary&gt; /// 1、普通单例 /// &lt;/summary&gt; public class SingletonA { private static SingletonA _instance = null; private SingletonA() { } public static Single...</summary><published>2012-05-08T07:47:00Z</published><updated>2012-05-08T07:47:00Z</updated><author><name>轮回</name><uri>http://www.cnblogs.com/dreign/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dreign/archive/2012/05/08/2490212.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dreign/archive/2012/05/08/2490212.html"/><content type="html">&lt;p&gt;本文介绍了C#下关于单例的4种实现方法。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Text;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; SingletonDemo&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 1、普通单例&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; SingletonA&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; SingletonA _instance = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; SingletonA() { }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; SingletonA CreateInstance()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (_instance == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;            {&lt;br/&gt;                _instance &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; SingletonA();&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; _instance;&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 2、线程安全单例&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; SingletonB&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;volatile&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; SingletonB _instance = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; lockHelper = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; SingletonB() { }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; SingletonB CreateInstance()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (_instance == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;lock&lt;/span&gt;&lt;span style="color: #000000;"&gt; (lockHelper)&lt;br/&gt;                {&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (_instance == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                        _instance &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; SingletonB();&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; _instance;&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 3、使用.net特性的支持多线程的单件模式代码&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;sealed&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; SingletonC&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; SingletonC() { }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt; SingletonC Instance = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; SingletonC();&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 4、使用 C# 2.0 泛型来完成单例模式的重用&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;typeparam name="T"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; SingletonProvider&amp;lt;T&amp;gt; &lt;span style="color: #0000ff;"&gt;where&lt;/span&gt; T : &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;    {&lt;br/&gt;        SingletonProvider() { }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; T Instance&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; SingletonCreator.instance; }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; SingletonCreator&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; SingletonCreator() { }&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt; T instance = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; T();&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 4、业务类demo&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; TestClass&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; _createdTimestamp;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; TestClass()&lt;br/&gt;        {&lt;br/&gt;            _createdTimestamp &lt;/span&gt;=&lt;span style="color: #000000;"&gt; DateTime.Now.ToString();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Write()&lt;br/&gt;        {&lt;br/&gt;            Console.WriteLine(_createdTimestamp);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 4、范型单例示例&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; demo&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; dosomething()&lt;br/&gt;        {&lt;br/&gt;            SingletonProvider&lt;/span&gt;&amp;lt;TestClass&amp;gt;&lt;span style="color: #000000;"&gt;.Instance.Write();&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/dreign/aggbug/2490212.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dreign/archive/2012/05/08/2490212.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dreign/archive/2011/07/20/2111262.html</id><title type="text">虚拟主机提供商的底线</title><summary type="text">国内的虚拟主机提供商有个像样的吗?谁能推荐个稳定的空间啊?这里声讨一下无耻的无忧主机51php.com，七月初主机故障，几天后修复，但数据回档到6月中旬（文章白写，评论全没，悲催啊），这还不说，发现因为主机商回复文件时，把我当月的流量全部耗光，期间多次联系客服，只是给简单把自动关闭的帐号重置一下，第二天系统检查流量然后又自动关闭，好了，这大半个月就这么捣糨糊，51php不认错，不道歉，不处理，新时代的“许三不”嘛，情何以堪啊？不在沉默中灭亡就在沉默中爆发，既然51php没有底线，我就帮你画个底线，让你感受一下SEO的河蟹打击力量。或许可以采用合法的手段，比如可以向神秘的有关部门投诉，比如51p</summary><published>2011-07-20T01:36:00Z</published><updated>2011-07-20T01:36:00Z</updated><author><name>轮回</name><uri>http://www.cnblogs.com/dreign/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dreign/archive/2011/07/20/2111262.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dreign/archive/2011/07/20/2111262.html"/><content type="html">&lt;div&gt;国内的虚拟主机提供商有个像样的吗?谁能推荐个稳定的空间啊?&lt;/div&gt;&lt;div&gt;这里声讨一下无耻的无忧主机51php.com，七月初主机故障，几天后修复，但数据回档到6月中旬（文章白写，评论全没，悲催啊），这还不说，发现因为主机商回复文件时，把我当月的流量全部耗光，期间多次联系客服，只是给简单把自动关闭的帐号重置一下，第二天系统检查流量然后又自动关闭，好了，这大半个月就这么捣糨糊，51php不认错，不道歉，不处理，新时代的&amp;ldquo;许三不&amp;rdquo;嘛，情何以堪啊？&lt;/div&gt;&lt;div&gt;不在沉默中灭亡就在沉默中爆发，既然51php没有底线，我就帮你画个底线，让你感受一下SEO的河蟹打击力量。&lt;/div&gt;&lt;div&gt;或许可以采用合法的手段，比如可以向神秘的有关部门投诉，比如51php的地方主管部门江西省通信管理局，但已现在公仆的调调，估计没什么戏，这点等以后让时间来证明。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;如果访问我的网站，估计看到的还是如下的信息：&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #ff0000;"&gt;This account has been suspended.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #ff0000;"&gt;Either the domain has been overused, or the reseller ran out of resources.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;下面是给51php的qq客服最后的咆哮，&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 微软雅黑, 宋体, Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 13px; letter-spacing: 1px; line-height: 20px;"&gt;客服的答复是没有答复，当你是空气，然后悄悄的重置了我的账户，我在拭目以待&lt;/span&gt;&lt;span class="Apple-style-span"&gt;。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;我的网站ooxxab.cn,我的id：dreign2，让你们清流量，你们不管，主机天天停，有意思吗？我要退款，还差多少天就退多少天的钱，已向江西省通信管理局投诉你公司，你们做不好服务，不能保证购买产品时的承诺，就要承担违约的责任，不是什么人都没有底线！！&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="color: #0000ff;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 微软雅黑, 宋体, Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 13px; letter-spacing: 1px; line-height: 20px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;每天51php后台检查流量然后自动锁定账户：&lt;/p&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="color: #0000ff;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 微软雅黑, 宋体, Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 13px; letter-spacing: 1px; line-height: 20px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote style="margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f1f1f1; background-position: initial initial; background-repeat: initial initial; border-width: 1px; border-color: #cccccc; border-style: dashed;"&gt;&lt;p&gt;&lt;em style="padding: 0px; margin: 0px;"&gt;主题: User dreign2 has been suspended for bandwidth overusage&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;在今天 00:11&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em style="padding: 0px; margin: 0px;"&gt;This is an automated message notifying you that User dreign2 has been suspended for bandwidth overusage.&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;The account will be automatically unsuspended at the beginning of the month when the bandwidth is reset.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/dreign/aggbug/2111262.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dreign/archive/2011/07/20/2111262.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dreign/archive/2011/02/22/1961213.html</id><title type="text">MonoTouch：用.NET开发iPhone应用</title><summary type="text">作者Bryan Costanich译者朱永光引言直到最近，要为苹果的iPhone开发应用程序的唯一选择就是一头扎进苹果的开发系统中。这意味着，你必须“愿意”在XCode IDE中编写Objective-C代码。对于很多开发人员，学习Objective-C被看作是一个巨大的障碍。特别对于哪些从来不用担心内存管理、指 针和C语言要负责处理的东西的开发人员来说，更是如此。随着MonoTouch框架（Novell的MonoProject的一部分）的出现，这一切都将改变。Mono Project是微软.NET平台的开源实现。其允许你在几乎任何平台上运行.NET应用程序，包括App</summary><published>2011-02-22T05:54:00Z</published><updated>2011-02-22T05:54:00Z</updated><author><name>轮回</name><uri>http://www.cnblogs.com/dreign/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dreign/archive/2011/02/22/1961213.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dreign/archive/2011/02/22/1961213.html"/><content type="html">&lt;p&gt;作者&amp;nbsp;&lt;strong&gt;&lt;a href="http://www.infoq.com/cn/author/Bryan-Costanich;jsessionid=25825CABE1EC3C1BAC070986ADC3B972"&gt;Bryan Costanich&lt;/a&gt;&amp;nbsp;&lt;/strong&gt;译者&lt;strong&gt;&lt;a href="http://www.infoq.com/cn/author/%E6%9C%B1%E6%B0%B8%E5%85%89;jsessionid=25825CABE1EC3C1BAC070986ADC3B972"&gt;&amp;nbsp;朱永光&lt;/a&gt;&lt;img alt="MonoTouchBoxPersonal.png" align="right" src="http://monotouch.net/@api/deki/files/12/=MonoTouchBoxPersonal.png" /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;引言&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;直到最近，要为苹果的&lt;span class="wp_keywordlink_affiliate"&gt;&lt;a href="http://ooxxab.cn/tag/iphone" title="查看 iPhone 的全部文章" target="_blank"&gt;iPhone&lt;/a&gt;&lt;/span&gt;开发应用程序的唯一选择就是一头扎进苹果的开发系统中。这意味着，你必须&amp;ldquo;愿意&amp;rdquo;在XCode IDE中编写Objective-C代码。对于很多开发人员，学习Objective-C被看作是一个巨大的障碍。特别对于哪些从来不用担心内存管理、指 针和C语言要负责处理的东西的开发人员来说，更是如此。&lt;/p&gt;&lt;p&gt;随着&lt;span class="wp_keywordlink_affiliate"&gt;&lt;a href="http://ooxxab.cn/tag/mono" title="查看 Mono 的全部文章" target="_blank"&gt;Mono&lt;/a&gt;&lt;/span&gt;Touch框架（Novell的&lt;span class="wp_keywordlink_affiliate"&gt;&lt;a href="http://ooxxab.cn/tag/mono" title="查看 Mono 的全部文章" target="_blank"&gt;Mono&lt;/a&gt;&lt;/span&gt;&amp;nbsp;Project的一部分）的出现，这一切都将改变。Mono Project是微软.NET平台的开源实现。其允许你在几乎任何平台上运行.NET应用程序，包括Apple、FreeBSD、Linux、Unix等 等。&lt;span class="wp_keywordlink_affiliate"&gt;&lt;a href="http://ooxxab.cn/tag/monotouch" title="查看 MonoTouch 的全部文章" target="_blank"&gt;MonoTouch&lt;/a&gt;&lt;/span&gt;是Mono Project的新组成部分，让你能够用C#和.NET平台编写可以运行在&lt;span class="wp_keywordlink_affiliate"&gt;&lt;a href="http://ooxxab.cn/tag/iphone" title="查看 iPhone 的全部文章" target="_blank"&gt;iPhone&lt;/a&gt;&lt;/span&gt;上的应用程序。&lt;/p&gt;&lt;p&gt;本篇文章的目的，就是提供&lt;span class="wp_keywordlink_affiliate"&gt;&lt;a href="http://ooxxab.cn/tag/monotouch" title="查看 MonoTouch 的全部文章" target="_blank"&gt;MonoTouch&lt;/a&gt;&lt;/span&gt;平台的一个完整介绍，让大家知道到那里获取必要的工具，&lt;span class="wp_keywordlink_affiliate"&gt;&lt;a href="http://ooxxab.cn/tag/monotouch" title="查看 MonoTouch 的全部文章" target="_blank"&gt;MonoTouch&lt;/a&gt;&lt;/span&gt;有什么样的限制，以及如何构建一个简单的应用程序。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;背景和限制&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对于打算为&lt;span class="wp_keywordlink_affiliate"&gt;&lt;a href="http://ooxxab.cn/tag/iphone" title="查看 iPhone 的全部文章" target="_blank"&gt;iPhone&lt;/a&gt;&lt;/span&gt;开发应用的.NET开发人员而言，MonoTouch的出现无疑是一件好事。然而，在决定创建应用程序之前，有一些限制和背景知识需要先了解清楚。&lt;/p&gt;&lt;p&gt;&lt;span id="more-4404"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;它如何工作？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在创建MonoTouch应用程序的时候，大部分非UI方面的.NET 3.5功能依旧可用，或者一些还处于计划之中（如.NET 4.0的功能）也囊括其中。这让你可以使用很多业已熟悉的.NET Framework技术来编写应用程序，包括Windows Communication Framework (WCF)、Workflow Foundation (WF)等等。也包括几乎所有的基类库（Base Class Library，BCL），涵盖诸如垃圾收集（Garbage Collection）、线程、数学函数、System.Net、加密等。对于可用的标准.NET程序集列表，见&lt;a href="http://monotouch.net/Documentation/Assemblies"&gt;http://monotouch.net/Documentation/Assemblies&lt;/a&gt;。MonoTouch是一种基础.NET函数库的特别定制版本，这也类似Silverlight和Moonlight的实现方式。&lt;/p&gt;&lt;p&gt;这意味着，你能够使用MonoTouch的核心程序集来编译标准的.NET 3.5代码成相应的函数库，并在你的应用程序中使用它们。因此，如果你有一个用于其它应用程序的特别函数库，其包含着一些用于工程问题的高级数学函数，那 么只需简单地把这些代码库加入到你的MonoTouch解决方案中，并引用它。在你构建解决方案的时候，编译器就利用MonoTouch核心函数库对其进行编译，接着就能在iPhone应用程序中使用它了。&lt;/p&gt;&lt;p&gt;MonoTouch也包括一些原生iPhone API的包装函数库，如访问位置（Location，GPS）、加速计、地址簿等的函数。MonoTouch也提供相应的功能，让你能够调用那些尚未进行包装的原生Objective-C函数库，所以你可以直接和现存的Objective-C代码进行互操作。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;我如何创建用户界面（UI），我能使用Silverlight吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;MonoTouch应用程序的UI需要使用苹果的Interface Builder（界面创建器，IB）应用程序来创建，IB连同iPhone SDK一起提供。Interface Builder使用Cocoa Touch（苹果用于iPhone的UI框架）控件对象，这些控件对象在iPhone上原生提供的。这意味着，你能在应用程序中使用所有的标准 iPhone控件，如选择器（Pickers）、滑动条（Sliders）、按钮等等。&lt;/p&gt;&lt;p&gt;你也能通过代码来创建界面，即实例化Cocoa Touch对象后，把它们添加到应用程序的视图（Views）中（关于视图，后面会详细讲述）。&lt;/p&gt;&lt;p&gt;然而，你不能利用传统的.NET技术，如Silverlight、WPF、WinForms等来创建MonoTouch界面。&lt;/p&gt;&lt;p&gt;Cocoa Touch使用一种融合了MVC（Model View Controller）模式思想的结构，我们将在后面一篇文章中介绍。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;我如何分发我的应用？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;MonoTouch应用程序的分发完全和传统iPhone应用程序的分发一样，既可以通过苹果App Store，也可以通过企业部署。&lt;/p&gt;&lt;p&gt;App Store是一个在线资源库，让用户可以付费购买（如果不是免费的话）和下载应用程序。可以从iTunes中访问，或直接通过iPhone本身来访问。为 了得到通过App Store分发应用的许可，你必须向苹果注册，并支付每年99美元的年费。&lt;/p&gt;&lt;p&gt;企业部署方式就是为公司开发内部应用程序，并分发给员工等人员使用，无需把应用在App Store中列出。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;什么是许可模型？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;不像Mono那样，MonoTouch不是开源的，且是一个收费产品。这意味着，如果你打算开发一些实际的应用，就必须购买软件许可。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;专业版（$399）&lt;/strong&gt;&amp;mdash;&amp;mdash;单个的个人开发人员许可，让你可以开发应用程序，并通过苹果App Store来分发它们。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;企业版（$999）&lt;/strong&gt;&amp;mdash;&amp;mdash;单个的企业开发人员许可，让你可以开发应用程序，并通过苹果App Store来分发它们，或者进行企业部署。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;企业版，5人（$3999）&lt;/strong&gt;&amp;mdash;&amp;mdash;和企业版一样，只是提供了5个坐席的授权。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;以上所有选项都包括了一年的免费升级权益。&lt;/p&gt;&lt;p&gt;还有一个评估版本，你只能把应用部署到模拟器中。出于介绍的目的，我们只需要评估版本就行。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MonoTouch有哪些限制？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;没有即时（JIT）编译&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;根据苹果的iPhone政策，任何应用程序都不能包含需要JIT编译的代码。但是稍等，.NET确实能正确工作，是不？对，不过MonoTouch是通过把应用程序编译为原生的iPhone程序集来跳过这个限制的。但是，这也带来了几个限制。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;泛型&lt;/strong&gt;&amp;mdash;&amp;mdash;泛型是由JIT编译器在运行时进行实例化的，然而，Mono具备一种提前（Ahead of Time ，AOT）编译的模式，可以为类似List&amp;lt;T&amp;gt;这样的泛型集合生成方法和属性。而泛型的其他用法，例如泛型虚方法、泛型类型上的 P/Invokes和Dictionary&amp;lt;TKey, TValue&amp;gt;上的值类型，就不被支持（虽然存在Dictionary&amp;lt;TKey, TValue&amp;gt;的代替方法）。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;动态代码生成&lt;/strong&gt;&amp;mdash;&amp;mdash;因为动态代码生成依赖于JIT编译器，所以对任何动态语言编译的过程也不能支持。包括System.Reflection.Emit、 Remoting和动态语言运行时（DLR）。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;C#是唯一的语言&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;另外，目前用于编写MonoTouch应用程序的唯一可用语言是C#。Visual Basic.NET有望在MonoTouch未来的发布中支持，不过此时此刻我们别无选择。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;更多信息&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;相关限制的完整列表和更多的信息，包括一些代替方法，可用参见&lt;a href="http://monotouch.net/Documentation/Limitations"&gt;http://monotouch.net/Documentation/Limitations&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;入门&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;要进入为iPhone创建MonoTouch应用程序的大门，我们需要下面几样东西：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;一个使用Intel CPU的Mac电脑，其要安装MacOSX 10.5或10.6 （Leopard或Snow Leopard）&lt;/li&gt;&lt;li&gt;苹果的iPhone SDK 3.0或更高版本&lt;/li&gt;&lt;li&gt;Mono的当前版本&lt;/li&gt;&lt;li&gt;MonoTouch SDK&lt;/li&gt;&lt;li&gt;一个IDE工具，如&lt;span class="wp_keywordlink_affiliate"&gt;&lt;a href="http://ooxxab.cn/tag/monodevelop" title="查看 MonoDevelop 的全部文章" target="_blank"&gt;MonoDevelop&lt;/a&gt;&lt;/span&gt;或XCode，或一个文本编辑器程序&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;安装着Leopard或Snow Leopard的Mac&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这是最重要也是最容易忽视的需求。尽管，理论上你能在任何平台上开发大部分应用程序，然而iPhone Simulator和Interface Builder只能在Leopard和Snow Leopard上运行。另外，编译器本身用到了一些特定于Intel Mac机器的底层功能，所以购买这样一台电脑是绝对必须的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;苹果的iPhone SDK&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;iPhone SDK可通过&lt;a href="http://developer.apple.com/iphone/"&gt;http://developer.apple.com/iphone/&lt;/a&gt;来免费下载，不过必须在苹果网站上注册，才能访问这个地址。&lt;/p&gt;&lt;p&gt;在安装了iPhone SDK后，要确保你能正常启动iPhone Simulator。要启动它，只需打开Spotlight，键入iPhone Simulator。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Mono&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;一旦你测试iPhone Simulator正常，那么就要安装Mono for OSX的最新版。Mono可以从&lt;a href="http://mono-project.com/Downloads"&gt;http://mono-project.com/Downloads&lt;/a&gt;下载。记住要点击&amp;ldquo;Intel&amp;rdquo;版本的链接，不要点CSDK版本。同样，安装MonoTouch SDK之前也需要安装Mono的。Mono的安装包是磁盘镜像的形式，挂接镜像，双击安装包，根据安装向导完成安装过程。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MonoTouch SDK&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;接下来，下载和安装最新的MonoTouch SDK。你既可以在MonoTouch商店（&lt;a href="http://monotouch.net/Store"&gt;http://monotouch.net/Store&lt;/a&gt;）购买，购买后会收到一个下载链接，也可以从&lt;a href="http://monotouch.net/DownloadTrial"&gt;http://monotouch.net/DownloadTrial&lt;/a&gt;下载评估版。如果购买了MonoTouch，你就能把应用程序部署到一台正确配置了的iPhone上，不过也可像我这样，仅仅在模拟器中运行。所以，目前 而言试用/评估版就足够了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;文本编辑器或集成开发环境（IDE）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你打算创建MonoTouch应用程序，所需的所有东西就是前面提及的，和一个文本编辑器。你能创建所有代码文件，并用命令行（终端窗口）来手动编 译。这种方式虽然可行，但是实际操作起来可能会非常痛苦，所以我们还是需要使用一个IDE来开发我们的应用程序。&lt;/p&gt;&lt;p&gt;你可以编辑/hack一下XCode（随iPhone SDK一起安装）来利用MonoTouch的函数库和编译器，也可以使用MonoTouch版的&lt;span class="wp_keywordlink_affiliate"&gt;&lt;a href="http://ooxxab.cn/tag/monodevelop" title="查看 MonoDevelop 的全部文章" target="_blank"&gt;MonoDevelop&lt;/a&gt;&lt;/span&gt;，其已经为MonoTouch应用 程序做好所有配置了。我们理所当然要用MonoDevelop，所以访问这里&lt;a href="http://monodevelop.com/Download/Mac_MonoTouch"&gt;http://monodevelop.com/Download/Mac_MonoTouch&lt;/a&gt;来 下载它。要安装MonoDevelop，只用把下载文件拖到应用程序目录中就行。&lt;/p&gt;&lt;p&gt;如果你已经正确安装Mono，那么MonoDevelop应该可以正常启动。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Hello World应用程序&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;现在，一切已经准备妥当，让我们开始来尝试开发点东西了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MonoDevelop&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;首先，启动MonoDevelop。你应该会看到和下图类似的界面【译者注：如果OSX的首选语言是中文的话，MonoDevelop的菜单和工具栏的文字显示不正常，所以最好把English拖到语言选项的第一位】：&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image1.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972"&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image1small.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;作为一个标准的IDE，看上去还是蛮熟悉的。它非常类似Visual Studio、SharpDevelop、Visual C# Express等等。&lt;/p&gt;&lt;p&gt;我们创建一个新解决方案，来包含iPhone项目。这里的解决方案和Visual Studio中的概念一样，实际上你可以在MonoDevelop中打开Visual Studio创建的解决方案。在MonoDevelop中的一个不同点就是，你能够在一个MonoDevelop实例中打开多个解决方案，正如下面的截图所示：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image2.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;这完全是由于在OSX中，你不能启动MonoDevelop的多个实例（事实上，任何程序都不行），且没有任何变通方法。所以，如果你需要在解决方案间切 换（例如，你希望另外打开一个包含示例代码的解决方案），你就能简单地一次性打开多个。&lt;/p&gt;&lt;p&gt;那么，说了上面这么多，让我们现在来创建一个解决方案吧。在菜单中，点File：New：Solution：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image3.jpg;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;我们要创建一个如下面截图所示的&amp;ldquo;iPhone MonoTouch Project&amp;rdquo;。选中它，并命名为Example_HelloWorld_1。&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image4.jpg;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;这里再次和Visual Studio中创建新解决方案的对话框很类似。点击Forward ，显示下一屏，直接点击OK，因为我们不需要这些功能：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image5.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;你现在应该可以看到如下所示的解决方案视图了（注意，我展开了解决方案中的节点，以便显示出所有文件和引用程序集）：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image6.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;我们来过一遍这些东西：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;References&lt;/b&gt;&amp;nbsp;&amp;mdash;&amp;mdash;这个文件夹包含MonoTouch应用程序需要的基本引用。MonoTouch程序集包括特定于iPhone的任何东西，也包括了所有Cocoa Touch控件的包装器，以及类似位置、数据等核心iPhone接口。以System.开头的程序集是.NET的基类库和运行时，其被裁减过以便能运行在 iPhone上。&lt;/li&gt;&lt;li&gt;&lt;b&gt;Main.cs&lt;/b&gt;&amp;nbsp;&amp;mdash;&amp;mdash;这和控制台应用程序、WPF应用程序等是一致的。在这里调用的是static void main() ，其是作为应用程序的入口点。过一下我们会仔细研究一下这个文件。&lt;/li&gt;&lt;li&gt;&lt;b&gt;MainWindow.xib和MainWindow.xib.designer.cs&lt;/b&gt;&amp;nbsp;&amp;mdash;&amp;mdash;这个和Winforms Window或WPF Window类似。xib文件实际上要在Interface Builder中进行编辑，而designer.cs文件包含这个窗体的属性。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;让我们来仔细研究一下Main.cs文件中的代码：&lt;/p&gt;using System;&lt;br/&gt;using System.Collections.Generic;&lt;br/&gt;using System.Linq;&lt;br/&gt;using MonoTouch.Foundation;&lt;br/&gt;using MonoTouch.UIKit;&lt;br/&gt;&lt;br/&gt;namespace Example_HelloWorld_1&lt;br/&gt;{&lt;br/&gt;public class Application&lt;br/&gt;{&lt;br/&gt;static void Main (string[] args)&lt;br/&gt;{&lt;br/&gt;UIApplication.Main (args);&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;// The name AppDelegate is referenced in the MainWindow.xib file.&lt;br/&gt;&lt;br/&gt;public partial class AppDelegate : UIApplicationDelegate&lt;br/&gt;{&lt;br/&gt;// This method is invoked when the application has loaded its UI and its ready to run&lt;br/&gt;public override bool FinishedLaunching (UIApplication app, NSDictionary options)&lt;br/&gt;{&lt;br/&gt;// If you have defined a view, add it here:&lt;br/&gt;// window.AddSubview (navigationController.View);&lt;br/&gt;&lt;br/&gt;window.MakeKeyAndVisible ();&lt;br/&gt;&lt;br/&gt;return true;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;// This method is required in iPhoneOS 3.0&lt;br/&gt;public override void OnActivated (UIApplication application)&lt;br/&gt;{&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;}&lt;p&gt;其中有两个有趣的地方。它包含一个Application类和一个AppDelegate类。从这里开始，和传统的.NET GUI开发就有所不同了。&lt;/p&gt;&lt;p&gt;iPhone应用程序的工作方式是，应用程序类（继承于UIApplication）包含了所有窗口、视图、控件和资源等等；同时应用程序委托类中（继承于UIApplicationDelegate）处理来自iPhone OS的回调，实际上会包括应用程序运行周期（Lifecycle）的事件（例如应用程序启动和应用程序终止）和大量的运行时事件（例如低内存报警）。&lt;/p&gt;&lt;p&gt;通过在应用程序委托类处理这些事件，你就能够响应它们。比如，在应用程序关闭的时候，&lt;code&gt;WillTerminate()&lt;/code&gt;方法将被调用，这样就有机会去保存任何用户数据、应用程序状态等。&lt;/p&gt;&lt;p&gt;在Application类中，具有一个Main() 方法。调用UIApplication.Main，Objective-C运行时将查找MainWindow.xib文件（它包含了 UIApplicationDelegate类的名称），实例化Application类（为单实例）后，就接着调用AppDelegate类中运行周期事件。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;你不必把主窗体的名称命名为&amp;ldquo;MainWindow.xib&amp;rdquo; （即所谓的主界面文件）。你可以任意命名它，只需告知编译系统去查找哪个文件就行。如果你希望它去查找不同的文件，在项目文件上右键打开项目选项，点击Options ，接着在Build : iPhone Application : Main Interface File中即可设置主窗体对应的文件。在应用程序启动的时候，Objective-C运行时将会尝试去加载那个文件，并根据这个文件内的设置来查找应用程序委托类。&lt;br /&gt;&lt;br /&gt;另外，你也可以任意命名你的应用程序委托类。默认情况下，它的名称为&amp;ldquo;AppDelegate&amp;rdquo;。要改变它，在Interface Builder中打开主界面文件，修改Application Delegate的名称。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;一会我们会回到Main.cs文件上来，不过首先来深入研究下应用程序的实际GUI。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Interface Builder&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;目前为止，已经读到了我们的iPhone应用程序的部分代码，可以深入研究一下如何构建它的界面了。苹果的应用程序设计工具包称之为Interface Builder。Interface Builder可以和开发环境松耦合。它可以编辑那些定义应用程序GUI的.xib文件。NIB和XIB的比较：Nib文件包含了窗口、控件等的XML表示，类似于WPF/Silverlight中的XAML模型。&lt;/p&gt;&lt;p&gt;不管是在XCode中编写Objective-C，或在MonoDevelop中编写C#，Interface Builder的用法都是完全一样的。能这样，完全是因为MonoDevelop能够监测Nib文件的变更，并添加/删除对应于Nib文件的适当代码到 designer.cs文件中。&lt;/p&gt;&lt;p&gt;你当然可以不打开Interface Builder，纯粹通过编程来创建整个GUI，有些开发人员确实也是这样做的。很多事情在Interface Builder也无法完成，就此而言，你还是需要编程来完成某些事情。Interface Builder隐藏了一些复杂的部分，在入门的时候，很容易使用Interface Builder来熟悉iPhone应用程序GUI的一些概念。&lt;/p&gt;&lt;p&gt;那么，说了这么多，让我们来着手创建界面了。在MainWindow.xib文件上双击。Interface Builder将启动，并能看到如下图所示的东西：&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image7.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972"&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image7small.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;让我们逐一研究一下这些窗口。从左到右，分别是：Document Window（文档窗口）、Design Surface Window（设计界面窗口）、Library Window（控件库窗口）和Inspector Window（检查器窗口）。&lt;/p&gt;&lt;p&gt;首先让我们来看Document Window：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image8.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;这个窗口显示了在.xib文件中的所有对象。这是默认的视图，你会发现它虽然样子漂亮，但没有太大用处，因为你的对象实际上是层级排列的，而图标视图只能同时显示一级。在我们添加控件到界面上的时候，它不会显示在这个视图中。所以，我们需要通过点击View Mode工具条上中间的图标来改变列表视图。改变后，应该会显示如下的样子：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image9.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;下一个窗口是设计界面。也就是，我们实际拖拽Cocoa Touch控件来设计我们界面的地方：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image10.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;当然，由于我们尚未添加任何控件到上面，所以现在还是一片空白。&lt;/p&gt;&lt;p&gt;下一个窗口是Library。Library包含了所有能在设计界面上使用的Cocoa Touch控件。如果你运行Leopard【译者注：原文这里为Snow Leopard，实际是错误的。】，那么你的控件库窗口如下所示：&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image11.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972"&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image11small.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;如果你运行Snow Leopard【译者注：原文这里未Leopard，实际是错误的。】，它应该是这个样子：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/1image12.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;注意它们两者还是非常类似的。在Snow Leopard里，有一个名为&amp;ldquo;Classes&amp;rdquo;的标签页，我们后面会讲到这个东西，不过这也是唯一的不同点。&lt;/p&gt;&lt;p&gt;这是Library的默认视图，不过我喜欢稍微不同的样子，以便我能一下看到更多的控件。为了改变Library窗口中的视图，右键点击控件视图，可以选择不同的显示风格。你也可以点击窗口左下角的Gear（齿轮）按钮。下图是Leopard中的&amp;ldquo;icons and labels&amp;rdquo;风格：&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image13.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972"&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image13small.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;而在Snow Leopard中是：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image14.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;最后一个窗口是Inspector Window：&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image15.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972"&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image15small.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Inspector具有四种不同的视图，可以通过窗口顶部的标签栏来选择。这些视图分别是Attribute Inspector、Connections Inspector、Size Inspector和Identity Inspector。Inspector大致和Visual Studio中的Property Explorer类似。它向你显示当前选中的Cocoa Touch对象的所有属性。也可以用它来设置可视化属性、布局等等。在创建Outlets和Actions时也用得着它，这个主题后面会谈到。在下面的图片中，我们在Document窗口中选择了Window对象，所以我们可以查看这个对象的相关属性。&lt;/p&gt;&lt;p&gt;现在，我们对Interface Builder窗口已经大致浏览了一遍，接下来让我们实际地创建一些东西。我们要创建如下这样的界面：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image16.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;首先，拖一个&amp;ldquo;Round Rect Button（圆角矩形按钮）&amp;rdquo;（UIButton）到窗口上。接着，在按钮上双击来设置文本。在这个过程中你会注意到，你会获得少许的指导。这些指导是基于苹果的人机交互向导（Human Interface Guidelines）的，来辅助你在视图上以适合的间距等来定位控件。&lt;/p&gt;&lt;p&gt;在窗口上添加了按钮后，拖入一个&amp;ldquo;Label（标签）&amp;rdquo;（UILabel）控件。改变它的尺寸以便接近窗口的宽度。接着双击这个label控件，删除文本以使应用程序启动的时候，标签的内容是空白的。&lt;/p&gt;&lt;p&gt;如果你正确地完成了所有步骤，那么你的Document Window将显示如下的样子（点击&amp;ldquo;Window&amp;rdquo;旁边的箭头就会看到它包含的子控件）：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image17.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;我们现在创建了第一个窗口界面。不过，不像传统的.NET GUI开发，你还不能编程访问这些控件。假如这是一个WPF应用程序，你一拖动控件到设计界面上，你就能通过this.ControlName这样的形式来访问它。如果你马上去查看MainWindow.designer.cs文件，除了&amp;ldquo;window&amp;rdquo;属性外，你看不到任何其他代码。为了让这些对象能被代码访问，我们必须通过Outlets把它们关联上。你在Interface Builder中创建一个Outlet（对象关联口）的时候，MonoDevelop将在这个类的designer.cs文件中添加一个匹配的属性，让你可以编程访问这些控件。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Outlets（对象关联口）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们来为之前添加的标签和按钮控件添加outlets，以便能在代码中访问它们。这点在Leopard和Snow Leopard上也有所区别，所以大家要严格遵循这里提到的正确指示。&lt;/p&gt;&lt;p&gt;【SNOW LEOPARD指示开始】&lt;/p&gt;&lt;p&gt;确保Library Window是打开的。点击顶部的&amp;ldquo;Classes&amp;rdquo;标签。点击第一个下拉列表框，这个就是所谓的&amp;ldquo;Library&amp;rdquo;，滚动到最后选择&amp;ldquo;Other Classes&amp;rdquo;。就会显示在你的项目中存在的自定义类。从上面列表中选择AppDelegate，接着选择下面的&amp;ldquo;Outlets&amp;rdquo;标签：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image18.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;点击&amp;ldquo;+&amp;rdquo;按钮两次来创建两个新的Outlet。&lt;/p&gt;&lt;p&gt;【SNOW LEOPARD指示结束】&lt;/p&gt;&lt;p&gt;【LEOPARD指示开始】&lt;/p&gt;&lt;p&gt;首先，保证在Document Window中App Delegate是被选中的。如果App Delegate未被选中，那么在创建Outlets的时候，它们的属性不会被创建，或者会在错误的地方创建。&lt;/p&gt;&lt;p&gt;接下来，来看Identity Inspector。Identity Inspector是Inspector窗口的最后一个标签页。现在，在Identity Inspector中定位到&amp;ldquo;Class Outlets&amp;rdquo;部分。在Class Outlets上，点击&amp;ldquo;+&amp;rdquo;按钮两次来创建两个新的Outlet。&lt;/p&gt;&lt;p&gt;【LEOPARD指示结束】&lt;/p&gt;&lt;p&gt;每个outlet都具有一个名称和一个类型。名称代表了控件属性的名字，这个类似于ASP.NET的ID，或WPF中的Name。类型是 Outlet的实际类型，比如UIButton、UILabel、UITextView等等。为了命名它们，在它们的名称上双击，键入相应的名称。对于我们之前添加的outlet来说，我们修改为&amp;ldquo;btnClickMe&amp;rdquo;和&amp;ldquo;lblResult&amp;rdquo;。&lt;/p&gt;&lt;p&gt;目前，它们两者的类型都是&amp;ldquo;id&amp;rdquo;。如果你不改变类型，就能把它们挂接到任何东西上，因为id就意味着动态类型，本质上就是.NET世界中的 &amp;ldquo;object&amp;rdquo;。id类型虽然好，不过我们打算把它们改为实际的类型。过一会我们会看到这样做会有什么不同。现在，双击btnClickMe的类型，键入&amp;ldquo;UIButton&amp;rdquo;。你的Class Outlets 窗口应该显示如下这个样子：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image19.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;如果在里面没有window的outlet，意味着你没有在App Delegate创建outlet。如果这样的话，删除Outlets，保证在Document Window中选中App Delegate，重新创建outlets。&lt;/p&gt;&lt;p&gt;现在我们已经创建了这些outlets了，就需要实际地把它们关联到我们的控件上。首先，在Inspector窗口上点击第二个标签页，来选中 Connections Inspector。在Outlets部分，应该可以看到我们之前创建的两个Outlets了。然而，你不能把它挂接到任何东西上。注意，&amp;ldquo;window&amp;rdquo;这个outlet已经挂接到&amp;ldquo;Window&amp;rdquo;对象上了。&lt;/p&gt;&lt;p&gt;为了挂接我们的Outlets，我们要从&amp;ldquo;Outlets&amp;rdquo;中的outlet圆点上，拖动到我们想要挂接的控件上。在这样做的时候，我们将会看到如下所示的效果：&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image20.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972"&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image20small.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;对两个Outlet都进行这样处理。你也可以从Connections Inspector拖到Document Window上。如果控件相互重叠的情况下，这样就很有用。下面的截图就描述了这种方式：&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image21.gif;jsessionid=25825CABE1EC3C1BAC070986ADC3B972"&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image21small.gif;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在我们这样做的时候，你可能会注意到一些有趣的事情。因为设置lblResult的类型为UILabel，所以在我们把它的 Outlet拖到Window的时候，它只允许我们挂接到那些类型一致的控件上，在这个例子中就是UILabel。另外一方面，btnClickMe能被拖到任何东西上，因为它具有动态的ID类型。这就是我们要设置强类型outlet的一个原因，以便降低它挂接到错误控件上的可能性。当然，这不是必须的，不过这样做是一个良好的习惯。&lt;/p&gt;&lt;p&gt;好的，现在我们创建好了界面了，outlets也挂接好了，让我们回到MonoDevelop把一起串在一起。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;回到MonoDevelop&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你打开MainWindow.designer.cs，在其中会到两个属性：&lt;/p&gt;[MonoTouch.Foundation.Connect("btnClickMe")]&lt;br/&gt;&lt;br/&gt;private MonoTouch.UIKit.UIButton btnClickMe {&lt;br/&gt;get {&lt;br/&gt;return ((MonoTouch.UIKit.UIButton)(this.GetNativeField("btnClickMe")));&lt;br/&gt;}&lt;br/&gt;set {&lt;br/&gt;this.SetNativeField("btnClickMe", value);&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;[MonoTouch.Foundation.Connect("lblResult")]&lt;br/&gt;&lt;br/&gt;private MonoTouch.UIKit.UILabel lblResult {&lt;br/&gt;get {&lt;br/&gt;return ((MonoTouch.UIKit.UILabel)(this.GetNativeField("lblResult")));&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;set {&lt;br/&gt;this.SetNativeField("lblResult", value);&lt;br/&gt;}&lt;br/&gt;}&lt;p&gt;有了这两个属性，就可以让我们通过代码来访问标签和按钮了。在这里要注意一件有趣的事情&amp;mdash;&amp;mdash;就算我们声明btnClickMe的类型为 id，而自动创建出来的属性也是强类型的UIButton。这是因为MonoDevelop足够智能，可以查看outlet背后实际的类型，以便创建适合类型的属性。这对于我们很有用，因为意味着我们在每次使用它的时候，都无需把btnClickMe属性转换为UIButton类型。&lt;/p&gt;&lt;p&gt;现在回到Main.cs文件，查看AppDelegate。我们来看一下FinishedLaunching方法。&lt;/p&gt;// This method is invoked when the application has loaded its UI and its ready to run&lt;br/&gt;&lt;br/&gt;public override bool FinishedLaunching (UIApplication app, NSDictionary options)&lt;br/&gt;{&lt;br/&gt;// If you have defined a view, add it here:&lt;br/&gt;// window.AddSubview (navigationController.View);&lt;br/&gt;&lt;br/&gt;window.MakeKeyAndVisible ();&lt;br/&gt;&lt;br/&gt;return true;&lt;br/&gt;}&lt;p&gt;正如注释所建议的，这个方法在Application实例化后且已经准备好运行之时，由Objective-C运行时来调用。第一句（window.AddSubview）被注释掉了，我们会在谈论Model View Controller（MVC）模式的时候来研究它的真正作用。&lt;/p&gt;&lt;p&gt;下一句window.MakeKeyAndVisible，设置MainWindow为主窗口并让其显示出来。在 iPhone开发中，真正有意思的事情是你永远有且有一个窗口在显示。如果想在iPhone应用程序中显示不同的界面，你要创建新的视图，并用视图控制器把其&amp;ldquo;推&amp;rdquo;到前端。然而，你不调用这个方法，iPhone OS就不会发送事件到你的窗口上。MakeKey这个部分是真正起作用的，而AndVisible部分实际上留有传统OS X Cocoa框架的痕迹。&lt;/p&gt;&lt;p&gt;我们来添加一些新代码到这个文件中。在我们创建Outlets的时候，我们是在AppDelegate中创建它们的。那意味着它们会出现在AppDelegate类中，所以可以在这里来访问它们。和传统的.NET GUI编程有一点不同的是，通常会有一个MainWindow.cs文件，在那里面来处理所有窗口相关的代码。而在这里，我们遵循Objective-C 的模式，就把代码放在AppDelegate中。&lt;/p&gt;&lt;p&gt;我们来把AppDelegate类改为如下这样子：&lt;/p&gt;// The name AppDelegate is referenced in the MainWindow.xib file.&lt;br/&gt;&lt;br/&gt;public partial class AppDelegate : UIApplicationDelegate&lt;br/&gt;&lt;br/&gt;{&lt;br/&gt;//---- number of times we've clicked&lt;br/&gt;protected int _numberOfClicks;&lt;br/&gt;&lt;br/&gt;// This method is invoked when the application has loaded its UI and its ready to run&lt;br/&gt;public override bool FinishedLaunching (UIApplication app, NSDictionary options)&lt;br/&gt;{&lt;br/&gt;// If you have defined a view, add it here:&lt;br/&gt;// window.AddSubview (navigationController.View);&lt;br/&gt;&lt;br/&gt;window.MakeKeyAndVisible ();&lt;br/&gt;&lt;br/&gt;//---- wire up our event handler&lt;br/&gt;this.btnClickMe.TouchDown += BtnClickMeTouchDown;&lt;br/&gt;&lt;br/&gt;return true;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;protected void BtnClickMeTouchDown (object sender, EventArgs e)&lt;br/&gt;{&lt;br/&gt;//---- increment our counter&lt;br/&gt;this._numberOfClicks++;&lt;br/&gt;//---- update our label&lt;br/&gt;this.lblResult.Text = "Hello World, [" + this._numberOfClicks.ToString () + "] times";&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;// This method is required in iPhoneOS 3.0&lt;br/&gt;public override void OnActivated (UIApplication application)&lt;br/&gt;{&lt;br/&gt;}&lt;br/&gt;}&lt;p&gt;第一件事情，我们添加了一个变量来跟踪点击次数，&amp;nbsp;&lt;code&gt;_numberOfClicks&lt;/code&gt;。接着，我们添加这行代码：&lt;code&gt;this.btnClickMe.TouchDown += BtnClickMeTouchDown;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;这就把btnClickMe的TouchDown事件（类似于OnClick）挂接到处理程序BtnClickMeTouchDown上&lt;/p&gt;&lt;p&gt;接着，在BtnClickMeTouchDown中，我们简单地用按钮被点击多少次的数量值来更新标签的显示内容。&lt;/p&gt;&lt;p&gt;好了，我们已经完成了所有编程，让我们来构建和运行一下。首先来构建。在菜单中，选择Build : Build All。如果目前为止你都正确的按部就班的话，它应该能构建成功。下一步，就是在iPhone模拟器上运行它。在工具栏上，确保debug|iPhoneSimulator被选中，如图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image22.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;接着，在菜单中选择Run : Run。在MonoTouch的评估版中，你只能在模拟器中运行，如果你打算在iPhone中运行，你会得到一个错误。&lt;/p&gt;&lt;p&gt;如果一切正常，模拟器会显示出来（实际上，它有可能隐藏在MonoDevelop窗口的背后，所以你需要切换过去），那么你就能看到如下所示的效果：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image23.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;点击按钮将会产生下图的结果：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image24.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;恭喜你！你已经创建并跑起你的第一个iPhone应用程序了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Actions（动作）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在我们刚刚创建的应用程序中，我们有一些Outlets，在代码中可以藉由属性来访问控件。就像在其他.NET GUI模型中，我们能把事件处理程序挂接到它们之上，来对事件作出响应。不过MonoTouch提供了另外一种响应用户输入的方式。这称之为 Actions。Actions类似于WPF的Commands，用这种方式，多个控件可以调用同一个方法，然后依据调用者是谁来决定如何去处理。让我们来稍微仔细地研究一下。确保你已经在MonoDevelop打开了Example_HelloWorld_1应用程序了。&lt;/p&gt;&lt;p&gt;双击MainWindow.xib文件来在Interface Builder中打开它。现在在标签控件下面添加两个按钮，类似下图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image25.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;再次，我们要针对Leopard和Snow Leopard作出不同的说明，你要确定按照正确的部分进行操作。&lt;/p&gt;&lt;p&gt;【SNOW LEOPARD指示开始】&lt;/p&gt;&lt;p&gt;在Library窗口中，确保选中&amp;ldquo;Classes&amp;rdquo;标签页，并再次在顶部的下拉列表框中选择&amp;ldquo;Other Classes&amp;rdquo;。接着，在上面选择AppDelegate，在下面选择&amp;ldquo;Actions&amp;rdquo;标签页。创建一个名为ActionButtonClick的 Action。你的Library窗口应该看起来如下所示：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/mage26.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;【SNOW LEOPARD指示结束】&lt;/p&gt;&lt;p&gt;【LEOPARD指示开始】&lt;/p&gt;&lt;p&gt;在窗口管理器中，确保选中App Delegate 。接着在Identity Inspector窗口中，在&amp;ldquo;Class Actions&amp;rdquo;里面创建一个名为ActionButtonClick的Action。你的Identity Inspector应该看起来如下所示：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image27.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;【LEOPARD指示结束】&lt;/p&gt;&lt;p&gt;我们刚刚在App Delegate上创建好了一个名为ActionButtonClick的通用动作。现在，要做的就是把它关联到按钮的 TouchDown事件上，以便在按钮被点击的时候，这个Action能被调用。&lt;/p&gt;&lt;p&gt;首先，选择一个动作按钮，接着转到Connections Inspector，把Touch Down拖动Document窗口中的App Delegate。如下图所示：&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image28.gif;jsessionid=25825CABE1EC3C1BAC070986ADC3B972"&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image28small.gif;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;注意，在我们拖到App Delegate的时候，会显示出一个可用Actions的列表。选择ActionButtonClick，现在按钮上的TouchDown事件就关联到这个动作上了：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image29.gif;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;为两个动作按钮都进行同样的操作。如果我们在Connections Inspector中查看App Delegate，会这样显示：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image30.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;通过点击&amp;ldquo;Multiple&amp;rdquo;旁边的箭头，可展开和ActionButtonClick相关的控件。保存好.xib文件后，回到 MonoDevelop中。&lt;/p&gt;&lt;p&gt;如果我们看一下MainWindow.designer.cs，会发现多了一行新代码：&lt;/p&gt;[MonoTouch.Foundation.Export("ActionButtonClick")] &lt;br/&gt;&lt;br/&gt;partial void ActionButtonClick (MonoTouch.UIKit.UIButton sender); &lt;p&gt;这是我们的Action的分部声明。注意它用MonoTouch.Foundation.Export特性标记进行了装饰。这使 Objective-C运行时可以找到关联到我们Action上的适当方法。编译器实际上会忽略没有任何实现的分部方法（正如我们在这里所见的这个），那么这个分部方法的声明实际上是为了在实现它的时候可以获得代码完成的功能。如果我们回到Main.cs，会看到它的真正作用。在AppDelegate类中，只要键入&amp;ldquo;partial&amp;rdquo;就会自动地得到ActionButtonClick的自动完成代码：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image31.gif;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;我们把如下代码写在里面：&lt;/p&gt;partial void ActionButtonClick (UIButton sender)&lt;br/&gt;&lt;br/&gt;{&lt;br/&gt;//---- show which button was clicked&lt;br/&gt;this.lblResult.Text = sender.CurrentTitle + " Clicked";&lt;br/&gt;}&lt;p&gt;现在，如果你运行应用程序，在动作按钮上点击，将会看到如下所示的效果：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/image32.png;jsessionid=25825CABE1EC3C1BAC070986ADC3B972" /&gt;&lt;/p&gt;&lt;p&gt;此时，我们已经完整地经历了用MonoTouch来开发基本iPhone应用程序的过程。现在，你应该对MonoTouch应用程序的结构、利用事件处理用户交互，以及用Actions来处理用户交互有了基本的了解。&lt;/p&gt;&lt;p&gt;不过，还有一件重要的事情被忽略了，我们应用程序只具有一个界面。在下一篇文章《The Model-View-Controller Pattern in MonoTouch》中，我们将会谈及具有多个界面的应用程序。&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.infoq.com/resource/articles/monotouch-introduction/en/resources/Example_HelloWorld_1.zip;jsessionid=25825CABE1EC3C1BAC070986ADC3B972"&gt;示例代码&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;查看英文原文：&lt;/b&gt;&lt;a href="http://www.infoq.com/articles/monotouch-introduction;jsessionid=25825CABE1EC3C1BAC070986ADC3B972"&gt;MonoTouch: .NET Development for the iPhone&lt;/a&gt;。&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;转载请注明：&lt;/strong&gt;&amp;nbsp;转载自&lt;a href="http://ooxxab.cn/"&gt;创造&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;本文链接地址:&lt;/strong&gt;&amp;nbsp;&lt;a href="http://ooxxab.cn/monotouch-with-net-development-of-iphone-applications.html"&gt;MonoTouch：用.NET开发iPhone应用&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;&lt;a rel="external nofollow" title="Follow me on Twitter!" href="http://twitter.com/ooxxab/"&gt;&lt;img src="http://ooxxab.cn/img/twitter.png" alt="Follow me on Twitter!" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a rel="external" title="关注创造的新浪微博" href="http://t.sina.com.cn/dreign" target="_blank"&gt;&lt;img src="http://ooxxab.cn/img/sina.png" alt="关注创造的新浪微博" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a rel="external" title="在 Google Buzz 上关注again" href="http://www.google.com/profiles/OOXXAB" target="_blank"&gt;&lt;img src="http://ooxxab.cn/images/buzz.gif" alt="在 Google Buzz 上关注again" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a rel="external" title="返回《创造》首页" href="http://ooxxab.cn/" target="_blank"&gt;&lt;img src="http://ooxxab.cn/favicon.ico" alt="返回《创造》首页" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="wumii-hook"&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.wumii.com/widget/relatedItems.htm"&gt;&lt;img src="http://static.wumii.com/images/pixel.png" alt="无觅相关文章插件" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div id="jiathis_style_32x32"&gt;&lt;a class="jiathis_button_qzone" href="http://ooxxab.cn/monotouch-with-net-development-of-iphone-applications.html" title="分享到QQ空间"&gt;&lt;span class="jiathis_txt jtico jtico_qzone"&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;a class="jiathis_button_tsina" href="http://ooxxab.cn/monotouch-with-net-development-of-iphone-applications.html" title="分享到新浪微博"&gt;&lt;span class="jiathis_txt jtico jtico_tsina"&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;a class="jiathis_button_kaixin001" href="http://ooxxab.cn/monotouch-with-net-development-of-iphone-applications.html" title="分享到开心网"&gt;&lt;span class="jiathis_txt jtico jtico_kaixin001"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a class="jiathis_button_renren" href="http://ooxxab.cn/monotouch-with-net-development-of-iphone-applications.html" title="分享到人人网"&gt;&lt;span class="jiathis_txt jtico jtico_renren"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a class="jiathis_button_t163" href="http://ooxxab.cn/monotouch-with-net-development-of-iphone-applications.html" title="分享到网易微博"&gt;&lt;span class="jiathis_txt jtico jtico_t163"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href="http://www.jiathis.com/share/?uid=899905" class="jiathis jiathis_txt jtico jtico_jiathis" target="_blank"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/dreign/aggbug/1961213.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dreign/archive/2011/02/22/1961213.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dreign/archive/2010/11/04/1868946.html</id><title type="text">360&amp;amp;QQ</title><summary type="text">亲爱的____用户：当您看到这封信的时候，我们刚刚作出了一个非常艰难的决定，在_____停止____之前，我们决定_____________。我们诚恳的向您致歉。 当您看到这封信的时候，我们刚刚作出了一个非常艰难的决定。在360公司停止对QQ进行外挂侵犯和恶意诋毁之前，我们决定将在装有360软件的电脑上停止运行QQ软件。我们深知这样会给您造成一定的不便，我们诚恳的向您致歉。 蒙牛做了个艰难的决定，...</summary><published>2010-11-04T05:20:00Z</published><updated>2010-11-04T05:20:00Z</updated><author><name>轮回</name><uri>http://www.cnblogs.com/dreign/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dreign/archive/2010/11/04/1868946.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dreign/archive/2010/11/04/1868946.html"/><content type="html">&lt;p&gt;亲爱的____用户：当您看到这封信的时候，我们刚刚作出了一个非常艰难的决定，在_____停止____之前，我们决定_____________。我们诚恳的向您致歉。 &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;当您看到这封信的时候，我们刚刚作出了一个非常艰难的决定。在360公司停止对QQ进行外挂侵犯和恶意诋毁之前，我们决定将在装有360软件的电脑上停止运行QQ软件。我们深知这样会给您造成一定的不便，我们诚恳的向您致歉。 &lt;/li&gt;    &lt;li&gt;蒙牛做了个艰难的决定，如果监测到用户胃里有伊利牛奶，将自动释放三聚氰胺。 &lt;/li&gt;    &lt;li&gt;亲爱的中国电信宽带用户： 当您看到这封信的时候，我们刚刚作出了一个非常艰难的决定，在停止使用中国移动和中国联通的手机之前，我们决定暂停所有家里有中国移动和中国联通手机的用户停止宽带服务 &lt;/li&gt;    &lt;li&gt;微软中国:我们刚刚作出了一个非常艰难的决定。在腾讯停止对360进行外挂侵犯和恶意诋毁之前，我们决定将在装有QQ软件的电脑上停止启动windows。 &lt;/li&gt;    &lt;li&gt;如果QQ有权不让我们选择360；那么微软就有权不让我们选择QQ；如果微软有权不让我们选择QQ;那么中国电信就有权给微软断网；如果中国电信有权断网；那么中国电网公司就有权给大家断电。。。 &lt;/li&gt;    &lt;li&gt;你见过麦当劳不允许顾客买KFC吗？你见过佳能不允许顾客买NIKON镜头吗？ 你见过阿迪达斯强行脱掉店内顾客NIKE的裤衩吗？ 你见过苹果不让自己的笔记本装WINDOWS系统吗？QQ不是流氓是什么？ &lt;/li&gt; &lt;/ul&gt;   &lt;ul&gt;   &lt;li&gt;一个老板听说装了360后不能用QQ，于是下令公司所有电脑上全部都装上360的产品，以遏制员工上班时间上QQ聊天 &lt;/li&gt;    &lt;li&gt;今天中国网友分裂成三种人，一种是卸载QQ，一种是卸载360，另外一种如我，在打酱油。 &lt;/li&gt;    &lt;li&gt;今天是中期选举的日子：美国人在两个政党之间选一个政党，中国人在两个流氓软件中选一个流氓软件。 &lt;/li&gt;    &lt;li&gt;解决QQ和360的冲突问题：禁止QQ安全组件的运行，把Application Data\Tencent\QQ里SafeBase这个文件夹的权限设置为完全拒绝。 &lt;/li&gt;    &lt;li&gt;腾讯顺便做点好事吧，请用户停止使用ie6，否则无法使用qq &lt;/li&gt;    &lt;li&gt;据有关人士称，今晚360多次试图攻击腾讯的服务器，但由于腾讯事先已全面部署了360安全卫士，而幸免于难。 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;可口可乐做了个艰难的决定，如果监测到用户胃里有百事可乐，将自动释放农药和汞。    &lt;br /&gt;中石化做了个艰难的决定，如果监测到用户汽车油箱里有中石油，将自动释放电火花。     &lt;br /&gt;肯德基做了个艰难的决定，如果监测到用户吃过有麦当劳，将自动释放牛屎。     &lt;br /&gt;百度做了个艰难的决定，如果监测到用户浏览Google，将自动封禁百度ID。。。     &lt;br /&gt;联通做了个艰难的决定，如果方圆百米内检测到有移动用户 将使这些用户不间断自动拨打110     &lt;br /&gt;郭小四做了一个艰难的决定，如果发现读者的脑袋里有韩寒的文字，将自动转化为黄色小说。     &lt;br /&gt;优乐美决定做了一个艰难的绝对，如果检测到用户胃里有立顿奶茶，将自动释放硫酸     &lt;br /&gt;周大福做了个艰难的决定，如果监测到用户有周生生的饰物，身上的饰物将自动氧化。     &lt;br /&gt;nike做了个艰难的决定，如果监测到用户曾穿过adidas将自动释放狐臭     &lt;br /&gt;TG做了个艰难的决定 如果检测有14上米国网站将自动发射核蛋     &lt;br /&gt;中华做了个艰难的决定，如果发现烟民嘴里有苏烟的味道，会自动转换成屁味。     &lt;br /&gt;NOKIA 做出艰难决定 如果检测到家里有MOTO手机 NOKIA将自动引暴     &lt;br /&gt;曼联作出了个艰难的决定，如果检测到用户拥有车、枪或鸟，将释放三叉戟插爆其狗头     &lt;br /&gt;猫扑做了一个艰难的决定，如果发现用户收藏夹里有D8的内容，页面讲自动跳转到tianya.com.     &lt;br /&gt;杰士邦做了个艰难的决定，如果监测到用户有使用杜蕾斯，将自动释放艾滋病毒。     &lt;br /&gt;广电总局做了个艰难的决定，如果发现用户有不和谐物的，会自动转换成诗歌朗诵     &lt;br /&gt;电信做了个艰难的决定，如果监测到用户小区里有使用网通，将自动短路。     &lt;br /&gt;本拉登做了个艰难的决定，如果监测到D8有美分的行为，将会发射AK47     &lt;br /&gt;迅雷做了一个艰难的决定，如果检测到用户电脑曾安装过快车，将拒绝下载教育片     &lt;br /&gt;东热终于做出了艰难的决定：如果检测到用户电脑存有1本岛的唉威，电脑里所有片都将变成打码葫芦娃或新闻联播。&amp;#160; &lt;br /&gt;空空做出了一个艰难的决定，如果检测到你电脑里面有其他女优的影片，空空的作品将会打上马赛克&amp;#160; &lt;br /&gt;宏基做了个艰难的决定，如果检测到电脑用户有的是联想品牌的，将壁纸强制转化为凤姐私密照     &lt;br /&gt;奔驰做了一个艰难的决定，如果监测到用户开过宝马，奔驰刹车系统将自动失灵     &lt;br /&gt;卡巴斯基做了一个艰难的决定，如果监测到用户安装过其他杀毒软件，将自动由杀毒模式转换为编写病毒模式     &lt;br /&gt;苏宁做出了一个艰难的决定，要是其所在的商业街有国美的存在将派出城管大队将国美移为平地     &lt;br /&gt;梅西做了个艰难的决定，如果监测到FIFA/实况/FM等游戏里有C罗的影子，将自动把C罗纳尔多的数据改为C毛纳尔彪。     &lt;br /&gt;苹果公司作出了一个非常艰难的决定，如果监测到用户在使用Iphone前吃了苹果以外水果，将启动自毁模式     &lt;br /&gt;中国电网做出了一个非常艰难的决定，如果用户为了使用QQ而卸载360，那么将会自动断电一小时。     &lt;br /&gt;北大做出了一个艰难的决定，要是其所在的校园有清华学生的话在将自动录取凤姐入学&amp;#160; &lt;br /&gt;凤姐做出一个艰难的决定，如果大家继续关注小月月，那么将拍全丄裸写真集。一人一张强行安装你的电脑桌面     &lt;br /&gt;黄晓明做了个艰难的决定，如果监测到用户有使用内增，将自动把用户变鸟粪。     &lt;br /&gt;两面针做出了一个艰难的决定，要是检测到用户有使用中华牙膏的历史将自动释放口臭物质     &lt;br /&gt;苏菲做了个艰难的决定，如果监测到用户有使用安尔乐，将自动侧漏     &lt;br /&gt;毓婷做了个艰难的决定，如果监测到用户有使用妈富隆，将自动闭经     &lt;br /&gt;淘宝做了个艰难的决定，如果检测到用户电脑中有浏览拍拍的记录，所有交易将自动翻倍价格处理。     &lt;br /&gt;米奇林做了艰难的决定，如果检测到用户亲属、朋友、工作伙伴等一系列社交圈内有人始用普林斯通轮胎的话，将会自动提速欺实码，然后爆胎     &lt;br /&gt;伊利做出了一个艰难的决定，如果检测到用户胃里有蒙牛牛奶，将自动释放三聚氰铵     &lt;br /&gt;飘柔做出一个艰难的决定，如果发现用户头上用过海飞丝，将自动转化成脱发剂&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dreign/aggbug/1868946.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dreign/archive/2010/11/04/1868946.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dreign/archive/2010/05/08/1730248.html</id><title type="text">政府网站的杯具</title><summary type="text">@CorndogCN 欢迎围观重庆政府 http://url.cn/4aEhRE在二手推里看到有人爆料重庆政府网站被hei，于是看了一下，果然不简单。看看低调的顺民Google，百度又立功了，有图有真像。同时希望有时候很快，有时候巨慢的有关部门尽快行动起来，脸上挂饭粒子不好看。还有，麻烦顺便也把网页的居中问题改改，浏览器兼容性又不难，起码居中不难。</summary><published>2010-05-07T23:08:00Z</published><updated>2010-05-07T23:08:00Z</updated><author><name>轮回</name><uri>http://www.cnblogs.com/dreign/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dreign/archive/2010/05/08/1730248.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dreign/archive/2010/05/08/1730248.html"/><content type="text">@CorndogCN 欢迎围观重庆政府 http://url.cn/4aEhRE在二手推里看到有人爆料重庆政府网站被hei，于是看了一下，果然不简单。看看低调的顺民Google，百度又立功了，有图有真像。同时希望有时候很快，有时候巨慢的有关部门尽快行动起来，脸上挂饭粒子不好看。还有，麻烦顺便也把网页的居中问题改改，浏览器兼容性又不难，起码居中不难。</content></entry><entry><id>http://www.cnblogs.com/dreign/archive/2010/05/06/1728565.html</id><title type="text">QQ概念版全员开放</title><summary type="text">QQ概念版是利用微软最新一代的客户端展现层技术–WPF，精心打造的创新型IM产品。QQ概念版是腾讯首款NUI(自然用户交互)产品，全面实现了多点触摸操作。在实现IM的基础功能外，QQ概念版还推出了动感相框、动态背景、多Tab聊天窗口、3D交互、矢量界面、桌面好友等一系列新功能、新体验以及Windows7的重要新特性。新功能介绍1.个性化登录界面 动态的画面展现，更富有生命力及亲切感，让...</summary><published>2010-05-06T01:20:00Z</published><updated>2010-05-06T01:20:00Z</updated><author><name>轮回</name><uri>http://www.cnblogs.com/dreign/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dreign/archive/2010/05/06/1728565.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dreign/archive/2010/05/06/1728565.html"/><content type="text">QQ概念版是利用微软最新一代的客户端展现层技术–WPF，精心打造的创新型IM产品。QQ概念版是腾讯首款NUI(自然用户交互)产品，全面实现了多点触摸操作。在实现IM的基础功能外，QQ概念版还推出了动感相框、动态背景、多Tab聊天窗口、3D交互、矢量界面、桌面好友等一系列新功能、新体验以及Windows7的重要新特性。新功能介绍1.个性化登录界面 动态的画面展现，更富有生命力及亲切感，让...</content></entry><entry><id>http://www.cnblogs.com/dreign/archive/2010/03/12/1684518.html</id><title type="text">数字金额转大写</title><summary type="text">C#数字金额转换大写金额</summary><published>2010-03-12T08:57:00Z</published><updated>2010-03-12T08:57:00Z</updated><author><name>轮回</name><uri>http://www.cnblogs.com/dreign/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dreign/archive/2010/03/12/1684518.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dreign/archive/2010/03/12/1684518.html"/><content type="text">C#数字金额转换大写金额</content></entry><entry><id>http://www.cnblogs.com/dreign/archive/2010/02/26/1674439.html</id><title type="text">好多门</title><summary type="text">兽兽妹未收场，工行女又出山，等急了张雅茹！2010年门好多，互联网真是个大茶几。工行女、张雅茹均是网友通过流传到网络上的视频、照片大量传播，工行女、张雅茹均是受害者。最后，工行女、张雅茹均是由于不小心流失艳照视频被网友捡到上传网络造成轰动效应，现在让我们具体来比较下两人。继兽兽门后，网络又掀起了工行女张璇事件，网友大量搜素工行女视频下载地址。工行女视频系其手机流传到网络上导致掀起网络色波，不少网友...</summary><published>2010-02-26T09:17:00Z</published><updated>2010-02-26T09:17:00Z</updated><author><name>轮回</name><uri>http://www.cnblogs.com/dreign/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dreign/archive/2010/02/26/1674439.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dreign/archive/2010/02/26/1674439.html"/><content type="text">兽兽妹未收场，工行女又出山，等急了张雅茹！2010年门好多，互联网真是个大茶几。工行女、张雅茹均是网友通过流传到网络上的视频、照片大量传播，工行女、张雅茹均是受害者。最后，工行女、张雅茹均是由于不小心流失艳照视频被网友捡到上传网络造成轰动效应，现在让我们具体来比较下两人。继兽兽门后，网络又掀起了工行女张璇事件，网友大量搜素工行女视频下载地址。工行女视频系其手机流传到网络上导致掀起网络色波，不少网友...</content></entry><entry><id>http://www.cnblogs.com/dreign/archive/2010/01/06/1640072.html</id><title type="text">网站更名</title><summary type="text">创造-以淡定的态度进行技术型扯蛋！2009-12-28，启动新名“创造”，扯动那根神经的火花来自那句广为流传的名言：“给我一个女人-我能创造一个家族！”，- _-! 这真的是在扯蛋了，“创造”是为了纪念1995年，轮回乐队出版了第一张专辑《创造》，我的最爱！！吴桐的离去结束了这个轮回，唯有缅怀《轮回》和我的那些懵懂青春岁月,有...</summary><published>2010-01-06T00:56:00Z</published><updated>2010-01-06T00:56:00Z</updated><author><name>轮回</name><uri>http://www.cnblogs.com/dreign/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dreign/archive/2010/01/06/1640072.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dreign/archive/2010/01/06/1640072.html"/><content type="text">创造-以淡定的态度进行技术型扯蛋！2009-12-28，启动新名“创造”，扯动那根神经的火花来自那句广为流传的名言：“给我一个女人-我能创造一个家族！”，- _-! 这真的是在扯蛋了，“创造”是为了纪念1995年，轮回乐队出版了第一张专辑《创造》，我的最爱！！吴桐的离去结束了这个轮回，唯有缅怀《轮回》和我的那些懵懂青春岁月,有...</content></entry><entry><id>http://www.cnblogs.com/dreign/archive/2009/12/26/1632950.html</id><title type="text">网赚</title><summary type="text">老婆大人时间比较多，于是找个既能让人提起兴趣又有利可图的事情做就是最好的选择了，网赚就是个不错的实验，暂且一试，今天是第3天，已经赚了几美分，嘿嘿！好吧，看看我都做了哪些准备工作：1.开通有VISA标示或者MasterCard信用卡或借记卡，并开通网上银行；2.申请不会被墙的免费邮箱，QQ、163的邮箱就挺好，既然要点国外的广告，还是推荐msn，gmail的比较好，邮箱很重要，后面申请paypal...</summary><published>2009-12-26T11:39:00Z</published><updated>2009-12-26T11:39:00Z</updated><author><name>轮回</name><uri>http://www.cnblogs.com/dreign/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dreign/archive/2009/12/26/1632950.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dreign/archive/2009/12/26/1632950.html"/><content type="text">老婆大人时间比较多，于是找个既能让人提起兴趣又有利可图的事情做就是最好的选择了，网赚就是个不错的实验，暂且一试，今天是第3天，已经赚了几美分，嘿嘿！好吧，看看我都做了哪些准备工作：1.开通有VISA标示或者MasterCard信用卡或借记卡，并开通网上银行；2.申请不会被墙的免费邮箱，QQ、163的邮箱就挺好，既然要点国外的广告，还是推荐msn，gmail的比较好，邮箱很重要，后面申请paypal...</content></entry></feed>
