当前位置: 首页 > 编程日记 > 正文

如何用 OS X 的 Xcode 写C语言程序

這篇是給新手看的。

如果你在 Windows 習慣使用 Visual C++ 或 Dev-C++ 的話,到了 Mac OS X 可能會突然不知道要怎麼寫程式,尤其當你已經用 Visual C++ 的 Debugger 用得很上手的話。

最近我們系上的課充滿了 C programming,我也稍微摸懂了 Xcode 的若干功能,至少我可以拿它來寫 C 語言的程式了,就像在 Windows 使用 Visual C++ 那樣。

如果這篇只是要教你怎麼按 Compile 的話,那我就是來騙文章數的了,因此這篇的內容還包括 怎麼使用 Xcode 的 Debugger 。


安裝 Xcode

Xcode 是在 OS X 上面寫 C 語言程式最簡單的方式。首先是去 Mac App Store 下載安裝 Xcode ,網址: https://itunes.apple.com/tw/app/xcode/id497799835?mt=12 。這不用錢,只是要裝很久。安裝完成後,可以在 Launch Pad 裡面找到 Xcode ,按一下開啟。如果找不到的話,可以在 Spotlight (螢幕右上角的放大鏡)裡面搜尋 "Xcode" ,也可以找到。

Screen Shot 2013-12-01 at 15.27.42.png

第一次打開 Xcode 你會看到 Welcome to Xcode 的畫面,做為第一次嘗試,請先按下 Create a new Xcode Project 。

Screen Shot 2013-12-01 at 15.32.50.png

Welcome to Xcode 這個畫面若以後不想看到,可以取消勾選 Show this window when Xcode launches 來永久關閉,往後若要打開新專案,可以按下功能表的 File → New → Project ... 。

新增 C 語言專案

剛剛說按下 「Create a new Xcode Project」,接著會跳出一個視窗,問你要開什麼專案。對於一般 C 程式作業來說,它被歸類在 OS X 的命令列工具裡面,所以,在左側選 OS X 裡面的 Application ,然後在右邊選 Command Line Tool 。

Screen Shot 2013-12-01 at 15.41.16.png

接著會要你輸入專案名稱,Organization Name 寫你的名字就行, Company Identifier 我不知道是做什麼的(我不是專門寫 OS X 軟體的),但並不會影響接下來的操作,所以像我這樣填一個看起來像樣的(?)就行。最下面的 Type 可以選 C 或 C++ ,還有其他 Objective-C-based Frameworks,這裡我直接選 C 。

Screen Shot 2013-12-01 at 15.42.58.png

最後按下 Next ,會要你找一個地方放這個專案,你就找個地方放就行了。

認識 Xcode IDE

Xcode IDE 的界面一打開跟 Visual Studio 、 Dev-C++ 都不一樣,從 Windows 來的人可能會不太習慣,不過不要緊,只要認識幾個東西就好了。

但在開始認識之前,請先到 Xcode → Preferences... 裡面的 Behaviors ,選 Running → Starts ,把 Show debugger 打開,並且把 Debug Area 打開,在 View → Debug Area → Show Debug Area 。這個預設沒開,但接下來會用到,非常重要,所以先打開。

Screen Shot 2013-12-01 at 16.47.13.png

接下來來認識一下 Xcode Project 視窗的基本配置:

Screen Shot 2013-12-01 at 15.54.26.png

請先認識:

  • 「執行」按鈕 (Run) ,長得像音樂軟體的 Play ,按下去就是執行程式
  • 「停止」按鈕 (Stop) ,長得像音樂軟體的 Stop ,在程式執行的時候可以強制停止
  • 「狀態列」 ,在最上方,會出現的狀態像是編譯或執行的成功與否
  • 「左側欄」 ,現在是顯示檔案列表(有其他列表可以切換)
  • 「主要工作區」 ,現在裡面是看不懂的東西,等下會切換到程式碼編輯
  • 「除錯區」 ,讓你方便對程式碼除錯,我會特別講這一個區域。

第一次執行程式

寫程式除了撰寫程式碼本身,最重要的就是要跑程式來看結果。剛剛介紹了「執行」按鈕,看起來可以按它來執行程式,那麼就按按看吧。按下去之後,你會看到狀態列的訊息有所改變,提示 Building 、 Build Success 、Running 等等,最後,你會在 Debug Area 的右邊看到這個:

Screen Shot 2013-12-01 at 16.03.27.png

嗯,程式可以執行,可以看到輸出了。

第一次修改程式

但是到現在還沒看到程式碼,剛剛說了左側欄是切換到「檔案列表」,也就是說檔案藏在裡面,請找一下 main.c ,按一下可以打開,主要工作區會變成程式碼:

Screen Shot 2013-12-01 at 16.07.13.png

這個程式碼你應該很熟悉,就是普通的 C 語言 Hello World 而已。

自動完成

接下來請試試看修改程式。假如我想要改成印出 10 次 Hello World 的內容,想必你會在 // insert code here 這邊加 for loop:

int i;
for (i = 0; i < 10; i++) {printf("Hello, World\n");
}

你打到一半的時候應該會出現這樣子的東西:

Screen Shot 2013-12-01 at 16.09.45.png

這個功能叫做 「自動完成」 (Auto Complete) ,是 Xcode 好用的功能之一,如果你從 Visual Studio 過來應該不陌生,就是打到一半,Xcode 會自動提示你可以寫什麼程式碼,並且按下 Tab 就可以自動跳到圓框來打字。你可以試試看,按 Tab 來切換,然後按 Enter 來確認。

自動完成其實無所不在,除了可以自動展開 Syntax 之外,還可以展開變數名稱、function 名稱(統稱 identifiers)、提示有哪些 .h 檔可以 include 、提示 struct 的結構。展開 identifers 的例子像是,你想要用 fputs ,打 fp ,它會自動出現所有 fp 開頭的函式(因為有 include stdio.h ,所以抓得到),按鍵盤的上下鍵可以選擇,除此之外,還會在右側欄出現簡單的說明。

如果你按 More 的話,還會出現完整的說明檔,這樣子就不需要上網查文件了。

Screen Shot 2013-12-01 at 16.28.08.png

再提一個秘訣,想要手動 trigger 自動完成的話,可以按 Esc 。例如我先宣告了 var1, var2, var3 ,想要對其中一個指定某值,打到一半只有 var 就跑到別行,再回來的話,可以在 var 的後方按 Esc ,就會跳出自動完成:

Screen Shot 2013-12-01 at 16.34.47.png

附帶一提,大小寫隨便打,它也認得出來。

你可以隨便試,你應該會感受到「他好像很聰明的樣子」。

自動錯誤提示

我改好了,結果 oops ,好像忘記什麼東西?

Screen Shot 2013-12-01 at 16.12.08.png

老師有教過變數要宣告齁!

程式寫錯,不用到編譯才知道, Xcode 會一直自動編譯,檢查你程式碼是否可以編譯通過,並且自動 標示錯誤 ,如果你按下行號旁邊的紅色驚嘆號,它會告訴你錯在哪:

Screen Shot 2013-12-01 at 16.14.16.png

對,忘記宣告了,補起來之後,這個錯誤訊息就會消失了。

錯誤訊息除了程式寫錯無法編譯之外,還會有編譯器來的警告,例如有個變數宣告了但沒使用:

Screen Shot 2013-12-01 at 16.18.11.png

如何,很方便吧?

執行程式與輸入資料

現在再來 Run 一遍,這次不要動滑鼠了,請按鍵盤上的 Command + R ,一樣會跑「執行」:

Screen Shot 2013-12-01 at 16.16.54.png

如果是從 Visual Studio 或 Dev-C++ 過來的,你可能會覺得奇怪,為什麼不是熟悉的黑底白字畫面?其實 Xcode 在執行的時候,並不是開一個新的終端機程式,而是直接在自己的 Console 裡面輸入輸出,我猜測這理由是因為 Xcode 是以 GUI 應用程式為主要導向,所以 Console 簡略就好,並且因為 OS X 是一種 UNIX 作業系統,天生就有輸入輸出轉向,可以直接接到 Xcode 裡面也很自然(這個在系統程式的課會教)。話說回來 Eclipse 好像也是長這樣。

不過,預設它並不會在執行的時候自動打開 Console,你必須手動開啟,所以一開始我才會請你先打開 Debug Area 。

接著來試著執行一個具備輸入輸出的簡單程式,輸入整數 n ,輸出 n 次 "Hello, World!\n"

int main(int argc, const char * argv[])
{int i, n;if (fscanf(stdin, "%d", &n) == 1) {for (i = 0; i < n; i++) {printf("Hello, World!\n");}}return 0;
}

按下 Run ,然後在 Console 裡面輸入 3 ,它就會輸入整數 n = 3 ,並且印出 3 次 Hello, World! ,跟我們想要的行為一致。

Screen Shot 2013-12-01 at 16.54.50.png

如果你執行到一半想把程式關掉,只要按下 Stop 就行了。

使用 Debugger

跟 Visual Studio 一樣,專業的 IDE 一定要有完美的 Debugger 整合,而 Xcode 當然也有,這對於我這種不熟悉命令列式 debugging 的人來說是相當棒的功能。 一般的命令列 debugger 要自己下斷點(告訴它在第幾行)、自己下指令,但有了 Xcode ,你只要動滑鼠就行了。

以下以一個簡單的小程式做範例:

#include <stdio.h>

/* global variables */
int i_am_a_global_variable = 999;/* functions */void another_function (int* a)
{(*a)++;i_am_a_global_variable += *a;return;
}int some_function (int a)
{int some_local_var = a;printf("some_local_var has been changed to %d\n", some_local_var);another_function(&some_local_var);printf("some_local_var has been changed to %d\n", some_local_var);return 0;
}int main (void)
{int number;printf ("enter number:");if (fscanf(stdin, "%d", &number) == 1) {some_function(number);printf("You’ve entered %d\n", number);} else {printf("No number entered. Bye.\n");}return 0;
}

斷點的定義是 「在執行這一行之前先回到 debugger」 ,也就是說如果你把斷點設在第 12 行,那麼它會在執行第 12 行之前暫停程式執行,進入 debugger。

設斷點的方法很簡單,在行號上 按一下滑鼠左鍵 就行了。斷點可以移動,用滑鼠拖曳便是。斷點可以暫時取消,即是點一下讓它變成淺藍色。斷點可以刪除,只要把它 拖曳出行號區 就行了,就像 Dock 一樣直觀操作。

現在我把斷點設在 some_function(number) 這一行。

Screen Shot 2013-12-01 at 17.01.39.png

然後執行程式,先在 Console 裡輸入數字,再按下 Enter 輸入到程式裡。接著,程式會立刻暫停,你會看到程式碼裡面,標示了停在哪一行,而 Debug Area 左側還會出現目前存在的區域變數。Debug Area 有個工具列,上面有幾個重要的按鈕,用途如圖:

Screen Shot 2013-12-01 at 17.03.13.png

這裡要先介紹通常 Debugger 會有的指令:

  • Continue (繼續) :離開 Debugger 繼續執行程式,可能會中斷在下一個斷點
  • Step Over (跳過) :跳過(執行)這一行,然後停在下一行
  • Step Into (跳入) :目前在的這一行有函式,跳進去
  • Step Out (跳出) :目前在的這一行是在某個函式裡面,跳出去到呼叫函式的程式(也就是 return 完畢)

熟悉這四個指令,你就可以在程式碼之間遊走了。

接著我再多設兩個斷點,分別在 i_am_a_global_variable += 和 another_function(&some_local_var); 這兩行(不必先把程式停下來,直接按滑鼠左鍵加斷點)。然後按下 Continue ,當它執行到 another_function 這行之前,就會再停下來進入 Debugger 。

你會發現左邊也有變化,因為進入了 Function Call 的 Stack 。你可以在不同的 Stack 之間切換,左邊也會出現不同的 Local Variables,切換的方式是按下 Debugger 導覽列的 function name。

Screen Shot 2013-12-01 at 17.22.23.png

接著再按一下 Continue,會跑進 another_function 裡面,你會發現在左邊窗格會顯示傳進去的指標的記憶體位址和指標所指的記憶體內容,以及,因為這個 function 有參照 (reference) 到全域變數 i_am_a_global_variable ,所以 Xcode 也會自動列出:

Screen Shot 2013-12-01 at 17.39.20.png

再來一個小範例,這次是陣列:

#include <stdio.h>

int main(void)
{int array[] = {1, 2, 3, 4, 5};int i;for (i = 0; i < 5; i++) {printf ("array #%d is %d\n", i, array[i]);}return 0;
}

斷點設在 printf 那一行,然後執行,你會發現它把陣列的內容也列出來了(按 ▼ 可以展開):

Screen Shot 2013-12-01 at 17.42.55.png

那如果是動態產生的陣列呢?

我們知道 malloc, calloc, realloc 傳回來的是它所分配到的記憶體的開頭位址,那 Xcode 會不會很聰明的把它當作陣列呢?

我們把上面這段程式修改成 calloc 的方式:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{int *array = (int *) calloc(5, sizeof(int));int i;for (i = 0; i < 5; i++) {array[i] = i + 1;printf ("array #%d is %d\n", i, array[i]);}free(array);return 0;
}

把斷點設在 free(array) 那一行,然後執行,你會發現 Debugger 並不會列出 array 的內容,而是只有指標:

Screen Shot 2013-12-01 at 17.48.49.png

從上圖我們知道兩件事:

  1. array 宣告成 int *,所以 Xcode 抓的是它的記憶體位址。
  2. 它用 int 去解讀 *array 指向的記憶體內容,所以得到的是首項的值 1,因為 array 的內容是 1, 2, 3, 4, 5。

那如果要看 array[1] 或其他內容的話怎麼辦呢?這時候就要用 Expression Monitor 了,可以在這個 variable 列表裡面按右鍵選 Add Expresssion... ,然後輸入 array[1] 就行了。另外,既然是 Expression ,當然可以輸入運算式,例如 array[1] + 2 。

Screen Shot 2013-12-01 at 17.57.08.png


Debugger 我會用的功能大概就這樣... 不過我覺得這樣也就夠了,用這些就足以抓出邏輯上的錯誤。

字型設定

我們每天看 code 的人,總是希望它們要長得順眼,才看得下去。Xcode 當然也可以調整字型。

進入 Xcode 的 Preferences 設定,在 Fonts & Colors 分頁裡面。不過每個項目是分開的,要一次改的話,是先按 Command + A 全選,然後按下 T 那個 icon ,就可以一次改全部了。附帶一提, Console 的字型是在同一個畫面的「Console」分頁裡面。

Screen Shot 2013-12-01 at 18.18.32.png

再附帶一提,我用的字體是 Adobe 出的 Source Code Pro ,可以免費下載。


转载自:https://blog.yorkxin.org/posts/2009/03/15/fundamental-c-with-xcode/


我會的大概也就這些,不知道算不算新手入門了... XD

相关文章:

【转】初等数论 ——原根、指标及其应用

转自&#xff1a;http://blog.163.com/gc_chdch126/blog/static/172279052201641935828402/ 学习总结&#xff1a;初等数论&#xff08;3&#xff09;——原根、指标及其应用 2016-05-19 15:58:28| 分类&#xff1a; 信息学——学习总 | 标签&#xff1a;初等数论 数学 |…

互联网产品评论索引

这里收集一些评论文章&#xff0c;定期查看文章观点的正确性&#xff0c;索引持续更新中 网站前期如何获得推广资源 专访陶瑾&#xff1a;微信公众平台开发先行者转载于:https://www.cnblogs.com/needrunning/p/3000353.html

Apache服务器部署(1)

apache&#xff08;web服务器&#xff09;简介&#xff1a; Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上&#xff0c;其跨平台和安全性被广泛使用&#xff0c;是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充&…

JavaScript关键字this指向

在js中this始终指向一个调用函数的那个对象 var a有种你干掉我啊; //纯粹调用函数 function test(){ console.log(this.a);//默认指向全局对象 } //test();//>windows.test() //作为对象的方法被调用 Function.prototype.logfunction(){ console.log(this.a); } //此时t为一…

项目开发过程中的收获与思考

2013年7月&#xff0c;我正式毕业了&#xff0c;到公司入职&#xff0c;也就正式成为了一名菜鸟程序员。到今天&#xff0c;2014年1月3日&#xff0c;目前主要的工作是公司一个项目中的一个功能模块&#xff0c;到我进入项目组算起&#xff0c;已经过了四个月了。因此&#xff…

【仿汽车之家】价格区间选择控件

仿照汽车之家iOS客户端“找车”栏目的价格区间选择控件&#xff0c;最终实现效果如下&#xff1a; 一、界面实现 *根据屏幕大小以及刻度的大小&#xff0c;宏定义需要用到的一些值 #define SCREENW [UIScreen mainScreen].bounds.size.width #define SCREENH [UIScreen mainScr…

Apache服务器部署(2)

签名CA证书 环境&#xff1a;server1:172.25.1.1 重置虚拟机 挂载yum源 [rootserver1 ~]# yum install mod_ssl -y //下载ssl模块 [rootserver1 ~]# yum install crypto-utils -y //安装加密软件 [rootserver1 ~]# genkey …

ASCII、Unicode、GBK和UTF-8字符编码的区别联系

一直对编码这块晕晕乎乎&#xff0c;今天终于看到一篇写的很清楚也很风趣的文章&#xff0c;转过来mark一下。 很久很久以前&#xff0c;有一群人&#xff0c;他们决定用8个可以开合的晶体管来组合成不同的状态&#xff0c;以表示世界上的万物。他们看到8个开关状态是好的&…

【iOS】快速集成轮播控件

自己写的一个轮播控件&#xff0c;初始化后只要实现两个数据源方法&#xff0c;几行代码就能快速集成&#xff0c;支持本地图片和网络图片&#xff0c;支持点击事件&#xff0c;可定制播放速度、指示器颜色/位置、默认加载图等&#xff0c;效果&#xff1a; 1.下载地址&#xf…

Hibernate中get方法和load方法的区别

一、get和load方法都是根据id去获得对应数据的&#xff0c;但是获得机制不同&#xff1a;如果使用get方法&#xff0c;hibernate会去确认该id对应的数据是否存在&#xff0c;它首先会去session中去查询(session缓存其实就hibernate的一级缓存)&#xff0c;如果没有&#xff0c;…

DNS高速缓存

DNS相关资料&#xff1a; 1.什么是DNS DNS&#xff08;Domain Name System域名系统&#xff09; 是互联网上存储域名和ip映射关系的一个分布式数据库&#xff0c;它负责把域名转换成ip地址&#xff0c;或ip地址转换为域名。DNS运行于TCP/UDP的53端口上。 2.什么是高速…

将时间改为显示:几天前,几小时前,或者几分钟前

&#xff08;原博客地址&#xff1a;http://blog.csdn.net/kenhins/article/details/38010811&#xff09; 方法一&#xff1a; 个人做法是保存时间戳&#xff0c;然后在前端用jq插件做转换&#xff0c;比如 smart-time-ago ----------------------------------------------- 方…

支持placeholder和自适配高度的TextView控件

一.应用于项目的效果如下&#xff1a; 二.使用方法&#xff1a; 1.导入JXTextView.h头文件 2.初始化,并添加到view中&#xff1a; JXTextView *textView [[JXTextView alloc] initWithFrame:CGRectMake(10, 10, 200, 30)];textView.placeholder "请输入内容";tex…

ZOJ 3735 dp

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode3735 好久没做DP题了&#xff0c;一开始没理解题目里的C(M,3)是干什么&#xff0c;原来就是组合&#xff0c;C M 取3&#xff0c;就等于n*&#xff08;n-1&#xff09;*&#xff08;n-2&#xff09;/6;题目里还有…

haproxy实现高可用及负载均衡

Haproxy简介&#xff1a; Haproxy是一个使用c语言编写的自由开发源代码软件&#xff0c;它提供高可用性、负载均衡、以及基于http和tcp的应用程序代理。Haproxy特别使用于那些负载特别大的web站点。Haproxy运行在当前的硬件上&#xff0c;完全可以支持数以万计的并发连接&#…

Apache转发到Tomcat

#vi /etc/httpd/conf/httpd.conf 添加下面配置 NameVirtualHost *:80 <VirtualHost *:80>ProxyPreserveHost OnServerName www.域名.comProxyPass / http://www.域名.com:8080/system/ErrorLog logs/error_logCustomLog logs/access_log common</VirtualHost> 作者…

.net基础问题

string sqlstr "select BranchCode,BranchName from t_sys_Branch where Jglx_DataDm{0} and IsVisible1"; sqlstr string.Format(sqlstr, departType); 上述代码运行之后 sqlstr"select BranchCode,BranchName from t_sys_Branch where Jglx_DataDmdepartTyp…

【iOS】NSDate分类,获得中国农历

1.说明&#xff1a; 参考网上代码写的一个分类&#xff0c;只需一句代码就可得到NSDate对象所对应的中国农历、星期。 2.使用方法&#xff1a; &#xff08;1&#xff09;导入分类头文件&#xff1a; #import "NSDateChineseDate.h"&#xff08;2&#xff09;NSDat…

LVS_NAT实现负载均衡

简介&#xff1a; 基于NAT机制实现。当用户请求到达director之后&#xff0c;director将请求报文的目标地址(即VIP)改成选定的realserver地址&#xff0c;同时将报文的目标端口也改成选定的realserver的相应端口&#xff0c;最后将报文请求发送到指定的realserver&#xff1b;…

自定义Push和Pop过渡动画

一、效果和源码 本文介绍如何实现一个NavigationController的自定义Push和Pop过渡动画&#xff0c;运行效果如下&#xff1a; 源码&#xff1a;https://github.com/dolacmeng/TransitionDemo 或http://download.csdn.net/detail/dolacmeng/9572384二、准备工作 首先&#xff0…

centos 安装 mysql 5.7

一&#xff0c;wget http://dev.mysql.com/get/mysql57-community-release-el6-8.noarch.rpm 二&#xff0c;yum localinstall mysql57-community-release-el6-8.noarch.rpm 三&#xff0c;yum install mysql-server 四&#xff0c;mysqld --initialize --usermysql 五&#xf…

c语言:婚礼上的谎言

/* 三对新人参加婚礼&#xff0c;三位新郎A,B,C,三位新娘X,Y,Z。 有人想知道谁与谁结婚&#xff0c;于是就问他们&#xff1a; A说他将和X结婚&#xff1b; X说他的未婚夫是C&#xff1b; C说他将和Z结婚。 这人时候知道他们都在说谎。编程求谁与谁结婚&#xff01; */ /* 思路…

redis主从复制、高可用和集群

redis简介&#xff1a; redis是一个key-value存储系统.和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hashs&#xff08;哈希类型&#xff09;;这些数据类型都支持push/pop、…

对学习编译原理的看法

我认为编译原理这本书是一门与代码做斗争的课程&#xff0c;学习编译原理能够追寻程序设计语言的本质&#xff0c;了解计算机各种语言编译的原理。学习了编译原理能够更加深入的了解计算机各种高级语言使用的原理&#xff0c;能使自己更加容易更加好的学习好程序语言&#xff0…

iOS提示气泡,带动画

1.效果如图&#xff1a; 从项目中抠出来的&#xff0c;做了简单的封装。 2.用法&#xff1a; //顶部提示HYNoticeView *noticeTop [[HYNoticeView alloc] initWithFrame:CGRectMake(50, 66, 250, 40) text:"这里可以查询全城婚礼人的档期哦&#xff01;" position:…

GIt/Github常用命令

1&#xff09;git init:初始化本地仓库 2&#xff09;创建文件&#xff1a;touch read.txt 3&#xff09;当操作本地的文件时&#xff0c;使用常用的命令&#xff0c;如&#xff08;mv&#xff0c;ls。。&#xff09;就可以操作&#xff0c;当操作暂存区的文件时需要在命令前家…

python练习题(python之“求一个数的阶乘并求结果中从后向前数第一个不为0(零)的数” 等)

实验环境&#xff1a;python2.7 题目1&#xff1a;python之“求一个数的阶乘并求结果中从后向前数第一个不为0(零)的数”程序&#xff1a; import math def factorial(n): #定义一个函数&#xff0c;返回一个数的阶乘 if n0: return 1 else: sumn*factorial(n-…

【动画1】UIView动画

讲一下动画。将分为以下5篇博客。 一&#xff09;UIView动画 二&#xff09;Layer动画 三&#xff09;3D动画 四&#xff09;转场动画 五&#xff09;第三方动画框架 相关代码&#xff1a;https://github.com/dolacmeng/AnimationDemo 参考资料&#xff1a;iOS Animation…

【python】解压文件

参考&#xff1a;http://essen.iteye.com/blog/1941489 tarfile模块 具体使用方法&#xff1a; https://docs.python.org/2/library/tarfile.html 例子&#xff1a;一次性解压所有文件 import tarfilet tarfile.open("abc.tgz", "r:gz")t.extractall(path…

JS设计模式——3.封装与信息隐藏

封装、信息隐藏与接口的关系 信息隐藏是目的&#xff0c;封装是手段。 接口提供了一份记载着可供公共访问的方法的契约。它定义了两个对象间可以具有的关系。只要接口不变&#xff0c;这个关系的双方都是可以替换的。 一个理想的软件系统应该为所有类定义接口。 创建对象的基本…