cocoapods 命令
-
pod init:初始化; -
pod install:安裝第三方庫; -
pod update:更新第三方庫; -
pod search <第三方庫名稱>:查找第三方庫;
git 常用命令
本地操作:
-
git init:初始化本地庫; -
git status:查看工作區(qū)、暫存區(qū)的狀態(tài); -
git add <file name>:將工作區(qū)的“新建或修改”添加到暫存區(qū);(不帶文件名的話,就是對倉庫中的所有文件進行操作) -
git rm --cached <file name>:移除暫存區(qū)中的內(nèi)容; -
git commit <file name>:將暫存區(qū)的內(nèi)容提交到本地; -
git commit -m "提交日志" <file name>:將暫存區(qū)的內(nèi)容提交到本地。
日志:
-
git log:查看歷史提交;
版本控制:
-
git reset --hard HEAD:強制工作區(qū)、暫存區(qū)、本地庫為當前HEAD指針所在的版本; -
git reset --hard HEAD^:回退一個版本; -
git reset --hard HEAD~1:回退 n 個版本,~后面的數(shù)字表示回退幾個版本;
比較差異:
-
git diff:比較工作區(qū)和暫存區(qū)的所有文件差異; -
git diff <file name>:比較工作區(qū)和暫存區(qū)的指定文件的差異;
分支操作:
-
git branch:查看當前分支; -
git branch -v:查看所有分支; -
git branch -d <分支名>:刪除指定的本地分支; -
git branch <分支名>:新建分支; -
git checkout <分支名>:從當前分支切換到指定分支; -
git merge <被合并分支名>:將指定的分支合并到當前分支; -
git checkout -b <本地分支名> origin/<遠程分支名>拉取遠程分支到本地。
本地倉庫與遠程倉庫交互:
-
git clone <遠程倉庫地址>:克隆遠程倉庫到本地,為本地庫新建orgin別名,并初始化本地庫; -
git remote -v:查看遠程倉庫地址別名; -
git remote add <別名> <遠程倉庫地址>:為遠程倉庫地址新創(chuàng)建一個別名; -
git remote rm <別名>:刪除本地中遠程庫別名; -
git push <別名> <分支名>:將本地庫某個分支推送到遠程庫,分支必須指定; -
git pull <別名> <分支名>:把遠程庫的修改拉取到本地;
什么是面向?qū)ο缶幊蹋?/h1>
面向?qū)ο缶幊贪衙嫦驅(qū)ο蟮乃枷霊糜谲浖_發(fā)。對象是由數(shù)據(jù)和所允許的操作組成的封裝體,與客觀實體有直接對應關系,類定義了具有相似性質(zhì)的一組對象。繼承性是對具有層次關系的類的屬性和操作進行共享的一種方式。所謂面向?qū)ο缶褪腔趯ο蟾拍?,以對象為中心,以類和繼承為構造機制,來認識、理解、 刻畫客觀世界,并設計、構建相應的軟件系統(tǒng)。面向?qū)ο缶幊逃幸韵氯筇卣鳎?/p>
- 封裝,把客觀事物封裝成抽象的類,并且類可以將自己的數(shù)據(jù)和方法只對可信的類或?qū)ο蠊_,對不可信的類或者對象隱藏。
- 繼承,子類繼承父類,子類可以使用父類的所有功能,并在無需改動父類的情況下對這些功能進行擴展。
- 多態(tài),繼承自同一個父類的不同子類對象以它們自己的方式響應相同的消息。
為什么說Objective-C是一種動態(tài)編程語言?
動態(tài)編程指的是程序在運行時可以改變其結構,新的函數(shù)可以被引進,已有的函數(shù)可以被刪除。而Objective-C具有在運行時動態(tài)確定對象的類型,動態(tài)綁定方法的實現(xiàn)和動態(tài)加載資源(在運行時構建新的類,給類添加屬性和方法)這幾種特性。因此,Objective-C是一種動態(tài)編程語言。
atomic和non-atomic修飾的屬性有什么區(qū)別?
- atomic:原子性,atomic修飾的屬性是線程安全的(只是保證了屬性的setter和getter的線程安全),但是效率低。
- non-atomic:非原子性,non-atomic修飾的屬性是線程不安全的,但效率高。
如何使用atomic才能保證線程安全?
atomic修飾的屬性,只是保證了setter和getter的線程安全,并不是所有操作都是線程安全的。例如,當在不同的線程對一個原子性的可變數(shù)組分別進行插入和刪除數(shù)據(jù)的操作時,就會出現(xiàn)問題??梢允褂面i來保證線程安全。有以下幾種加鎖方式:
-
@synchronized指令,使用最簡單,性能也最差。 - 信號量。
- 互斥鎖。
- 遞歸鎖。
-
OSSpinLock自旋鎖(有線程優(yōu)先級反轉bug。如果訪問自旋鎖的線程的優(yōu)先級都是相同的,則沒有問題)。
@synthesize和@dynamic分別有什么作用?
@synthesize告知編譯器自動為給定屬性生成set和get方法。
@dynamic告知編譯器不要自動生成給定屬性的set和get方法,這兩個方法會由開發(fā)者手動生成。
readwrite,readonly,assign,retain,strong,copy,weak屬性關鍵字的作用。
-
readwrite:屬性可讀可寫,也就是說外部可以訪問該屬性并且可以修改該屬性的值。 -
readonly:屬性只讀,也就是說外部只能訪問該屬性,但不能修改該屬性的值。 -
assign:給屬性分配值時,不會增加屬性值的引用計數(shù)。 -
retain:給屬性分配值時,會使屬性值的引用計數(shù)加1。 -
weak:ARC模式下,給屬性分配值時,不會增加屬性值的引用計數(shù)。 -
strong:ARC模式下,給屬性分配值時,會使屬性值的引用計數(shù)加1。 -
copy:內(nèi)容拷貝,分為淺拷貝和深拷貝。- 淺拷貝:只是拷貝了指向?qū)ο蟮膬?nèi)存地址的指針,對象的引用計數(shù)會加1。
- 深拷貝:會拷貝對象的具體內(nèi)容,拷貝得到的對象和原對象的內(nèi)容是相同的,但是內(nèi)存地址是不同的。
#import、#include 和 @class 的區(qū)別
import是Objective-C導入頭文件的關鍵字,include是C/C++導入頭文件的關鍵字。使用include導入頭文件時,相當于拷貝導入的頭文件中的聲明內(nèi)容。如果使用include重復導入某個頭文件的話,編譯器會報重復定義的錯誤。而使用import導入頭文件,編譯器會在編譯時做一次判斷,如果已經(jīng)導入了該頭文件就不會再二次導入了。如果不是C/C++文件,應盡量使用import。并且如果能在.m文件中import,就不要在.h文件中import。
@class用于聲明某個類,其告訴編譯器它后面的內(nèi)容是一個類的名稱,而這個類的具體實現(xiàn)暫時是不知道的。而在一個類的頭文件中使用import導入某個類的時候,這個類的所有信息都會被導入。如果在許多個類的頭文件中都使用import導入了該類,會降低編譯器編譯的效率。另外,當兩個類使用import互相引用時,編譯器會報錯,而使用@class能夠避免出現(xiàn)錯誤。
delegate,block 和 notification 的區(qū)別
- delegate:對于同一個協(xié)議,一個對象只能設置一個代理,也就是說只能一對一地通信。代理注重信息傳輸?shù)倪^程。例如,發(fā)起一個網(wǎng)絡請求后,我們想要知道此時請求是否已經(jīng)開始、是否收到了數(shù)據(jù)、數(shù)據(jù)是否已經(jīng)接受完成、數(shù)據(jù)接收失敗,此時就應該在同一個協(xié)議中聲明對應的委托方法,然后使用一個代理對象調(diào)用對應的委托方法來傳輸這些信息。
- block:block也只能一對一地通信,其注重信息傳輸?shù)慕Y果。例如,對于某個操作,我們只想知道其操作結果,這時應該使用block。相對于代理,其寫法簡單,不需要聲明協(xié)議和委托方法。但使用block時,容易導致循環(huán)引用。
- notification:能夠一對多地通信。當多個對象都需要對某個操作做出響應時,應該使用通知。
如何實現(xiàn)下拉刷新?
創(chuàng)建一個UIScrollView的分類,在分類中動態(tài)添加一個header屬性,header是一個自定義視圖,用于顯示與刷新狀態(tài)有關的文字,圖片和活動指示器,將其添加到UIScrollView的頭部。為UIScrollView的contentOffset屬性注冊觀察者,在contentOffset更改時,根據(jù)當前contentOffset來判斷此時UIScrollView處于準備刷新、正在刷新中和刷新完畢這三個狀態(tài)中的哪一種,并根據(jù)狀態(tài)來設置header當前需要顯示的內(nèi)容。
如何使用UICollectionView實現(xiàn)無限循環(huán)輪播圖?
根據(jù)需要展示的圖片資源構造一個圖片數(shù)組,該圖片數(shù)組包含所有需要展示的圖片,同時,把最后展示的圖片拷貝一份插入到圖片數(shù)組的最前面,把最先展示的圖片拷貝一份插入到圖片數(shù)組的最后面,然后將該數(shù)組設置為UICollectionView的數(shù)據(jù)源。在UICollectionView滑動到展示圖片數(shù)組中的最后一張圖片的位置時,將UICollectionView的contentOffset隱式地切換到展時圖片數(shù)組中的第二張圖片的位置。在UICollectionView滑動到展示圖片數(shù)組中的第一張圖片的位置時,將UICollectionView的contentOffset隱式地切換到展時圖片數(shù)組中的倒數(shù)第二張圖片的位置。這樣就實現(xiàn)了無限循環(huán)展示圖片的效果。