在ObjC中對象時存儲在堆中的,系統並不會自動釋放堆中的內存(注意基本類型 是由系統本身管理的,放在棧上)。若是一個對象建立並使用後沒有獲得及時釋 放那麼就會佔用大量內存。OjbC中的內存管理就須要由開發人員手動維護。 1)引用計數器:在ObjC中每一個對象內部都有一個與之對應的整數(retainCount),叫「引用計數器」,當一個對象在建立以後它的引用計數器爲1, 當調用這個對象的alloc、retain、new、copy方法以後引用計數器自動在原 來的基礎上加1(ObjC中調用一個對象的方法就是給這個對象發送一個消息), 當調用這個對象的release方法以後它的引用計數器減1,若是一個對象的引用 計數器爲0,則系統會自動調用這個對象的dealloc方法來銷燬這個對象。 2)屬性參數:能夠經過@property定義屬性,此刻沒必要手動實現 getter,setter方法程序仍然沒有內存泄露,由於屬性定義的時候咱們一樣加 上了參數
3)自動釋放池:一種內存自動釋放的機制叫作「自動引用計數」(或「自動釋放 池」),使用@autoreleasepool關鍵字聲明一個代碼塊,若是一個對象在初始 化時調用了autorelase方法,那麼當代碼塊執行完以後,在塊中調用過 autorelease方法的對象都會自動調用一次release方法。這樣對象就起到了 延遲自動釋放的效果. 注意: ######1.autorelease方法不會改變對象的引用計數器,只是將這個對象放 到自動釋放池中; ######2.自動釋放池實質是當自動釋放池銷燬後調用對象的release方法,不 必定就能銷燬對象(例如若是一個對象的引用計數器>1則此時就沒法銷燬); ######3.因爲自動釋放池最後統一銷燬對象,所以若是一個操做比較佔用內存 (對象比較多或者對象佔用資源比較多),最好不要放到自動釋放池或者考慮放 到多個自動釋放池; ######4.ObjC中類庫中的靜態方法通常都不須要手動釋放,內部已經調用了 autorelease方法;
淺複製:本質是將一個對象1的地址,交給了另外一個對象2,若是對象被釋放,則對 象2所指的地址是不安全的. 深複製:要使用copy方法,則對象必須遵照NSCopying協議 實質:將原對象的內容複製到一塊新的內存空間,拷貝的是整個對象.
1)類擴展僅可以在原始類中聲明(.h或.m中都可,在.m中聲明的類擴展其定義的 屬性和方法均是私有的) 2)類擴展的實現僅可以在原始類的.m中編寫 3)在類擴展中能夠擴展類的屬性.而在分類中僅可以擴展實例方法和類方法
1)使用block實現委託模式優勢ios
回調的block代碼塊定義在委託對象函數內部,使代碼更爲緊湊;適配對象再也不 須要實現具體某個protocol,代碼更爲簡潔。代碼可讀性更強,更有連貫性, block常常能夠用於completion handler、error handler等。網絡請求回調。
2)delegate的優點:程序員
1.很是嚴格的語法。全部將聽到的事件必須是在delegate協議中有清晰的定義。 2.若是delegate中的一個方法沒有實現那麼就會出現編譯警告/錯誤 3.協議必須在controller的做用域範圍內定義 4.在一個應用中的控制流程是可跟蹤的而且是可識別的; 5.在一個控制器中能夠定義多個不一樣的協議,每一個協議有不一樣的delegate 6.沒有第三方對象要求保持/監視通訊過程。 7.可以接收調用的協議方法的返回值。這意味着delegate可以提供反饋信息給controller
@class通常用於頭文件中須要聲明該類的某個實例變量的時候用到,在m文 件中仍是須要使用#import 而#import比起#include的好處就是不會引發交叉編譯
self.name ="object":會調用對象的setName()方法; name = "object":會直接把object賦值給當前對象的name屬性。
viewDidLoad在view從nib文件初始化時調用, loadView在controller的view爲nil時調用。 此方法在編程實現view時調用,view控制器默認會註冊memory warning notification, 當view controller的任何view沒有用的時候, viewDidUnload會被調用,在這裏實現將retain的view release,若是是 retain的IBOutlet view 屬性則不要在這裏release,IBOutlet會負責 release 。
(1)數組能夠申請在棧區和數據區;指針能夠指向任意類型的內存塊 (2)sizeof做用於數組時,獲得的是數組所佔的內存大小;做用於指針時,得 到的都是4個字節的大小 (3)數組名錶示數組首地址,值不能夠改變,如不能夠將++做用於數組名上; 普通指針的值能夠改變,如可將++做用於指針上 (4)用字符串初始化字符數組是將字符串的內容拷貝到字符數組中;用字符串初 始化字符指針是將字符串的首地址賦給指針,也就是指針指向了該數組
(1)函數體內static 變量的做用範圍爲該函數體,不一樣於 auto 變量,該變 量的內存只被分配一次, 所以其值在下次調用時仍維持上次的值; (2)在模塊內的static 全局變量能夠被模塊內所用函數訪問,但不能被模塊外 其它函數訪問; (3)在模塊內的static 函數只可被這一模塊內的其它函數調用,這個函數的使 用範圍被限制在聲明 它的模塊內; (4)在類中的static 成員變量屬於整個類所擁有,對類的全部對象只有一份拷 貝; (5)在類中的static 成員函數屬於整個類所擁有,這個函數不接收 this 指 針,於是只能訪問類的static 成員變量。
(1)代碼區:存放函數二進制代碼 (2)數據區:系統運行時申請內存並初始化,系統退出時由系統釋放。存放全局變 量、靜態變量、常量 (3)堆區:經過malloc等函數或new等操做符動態申請獲得,需程序員手動申請和釋 放 (4)棧區:函數模塊內申請,函數結束時由系統自動釋放。存放局部變量、函數參數
(1)定義了一個指向不可變的字符串的字符指針 (2)和(1)同樣 (3)定義了一個指向字符串的指針,該指針值不可改變,即不可改變指向 (4)定義了一個指向不可變的字符串的字符指針,且該指針也不可改變指向
MVC模式考慮三種對象:模型對象、視圖對象和控制器對象。 模型對象負責應用程序的數據和定義操做數據的邏輯; 視圖對象知道如何顯示應用程序的模型數據; 控制器對象是M與V之間的協調者。
objc優勢: 1) Cateogies 2) Posing 3) 動態識別 4) 指標計算 5)彈性訊息傳遞 6) 不是一個過分複雜的 C 衍生語言 7) Objective-C 與 C++ 可混合編程 缺點: 1) 不支援命名空間 2) 不支持運算符重載 3) 不支持多重繼承 4) 使用動態運行時類型,全部的方法都是函數調用,因此不少編譯時優 化方法都用不到。(如內聯函數等),性能低劣。
隊列和棧是兩種不一樣的數據容器。從"數據結構"的角度看,它們都是線性結構, 即數據元素之間的關係相同。 隊列是一種先進先出的數據結構,它在兩端進行操做,一端進行入隊列操做,一 端進行出列隊操做。 棧是一種先進後出的數據結構,它只能在棧頂進行操做,入棧和出棧都在棧頂操 做。
loadView儘管不直接調用該方法,如多手動建立本身的視圖,那麼應該覆蓋這個 方法並將它們賦值給試圖控制器的view屬性。 viewDidLoad只有在視圖控制器將其視圖載入到內存以後才調用該方法,這是執 行任何其餘初始化操做的入口。 viewDidUnload當試圖控制器從內存釋放本身的方法的時候調用,用於清楚那些 可能已經在試圖控制器中建立的對象。 viewVillAppear當試圖將要添加到窗口中而且還不可見的時候或者上層視圖移 出圖層後本視圖變成頂級視圖時調用該方法,用於執行諸如改變視圖方向等的操 做。實現該方法時確保調用[super viewWillAppear:]. viewDidAppear當視圖添加到窗口中之後或者上層視圖移出圖層後本視圖變成頂 級視圖時調用,用於放置那些須要在視圖顯示後執行的代碼。確保調用[super viewDidAppear:]。
1) UIView是iOS系統中界面元素的基礎,全部的界面元素都是繼承自它。它本 身徹底是由CoreAnimation來實現的。它真正的繪圖部分,是由一個CALayer 類來管理。UIView自己更像是一個CALayer的管理器,訪問它的跟繪圖和跟座標 有關的屬性。 2) UIView有個重要屬性layer,能夠返回它的主CALayer實例。 3) UIView的CALayer相似UIView的子View樹形結構,也能夠向它的layer上 添加子layer,來完成某些特殊的表示。即CALayer層是能夠嵌套的。 4) UIView的layer樹形在系統內部,被維護着三份copy。分別是邏輯樹,這裏 是代碼能夠操縱的;動畫樹,是一箇中間層,系統就在這一層上更改屬性,進行 各類渲染操做;顯示樹,其內容就是當前正被顯示在屏幕上得內容。 5) 動畫的運做:對UIView的subLayer(非主Layer)屬性進行更改,系統將 自動進行動畫生成,動畫持續時間的缺省值彷佛是0.5秒。 6) 座標系統:CALayer的座標系統比UIView多了一個anchorPoint屬性,使 用CGPoint結構表示,值域是0~1,是個比例值。這個點是各類圖形變換的座標 原點,同時會更改layer的position的位置,它的缺省值是{0.5,0.5},即在 layer的中央。 7)渲染:當更新層,改變不能當即顯示在屏幕上。當全部的層都準備好時,能夠 調用setNeedsDisplay方法來重繪顯示。 8)變換:要在一個層中添加一個3D或仿射變換,能夠分別設置層的transform或 affineTransform屬性。 9)變形:Quartz Core的渲染能力,使二維圖像能夠被自由操縱,就好像是三維 的。圖像能夠在一個三維座標系中以任意角度被旋轉,縮放和傾斜。 CATransform3D的一套方法提供了一些魔術般的變換效果。
進程和線程都是由操做系統所體會的程序運行的基本單元,系統利用該基本單元 實現系統對應用的併發性。 程和線程的主要差異在於它們是不一樣的操做系統資源管理方式。進程有獨立的地 址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是 一個進程中的不一樣執行路徑。線程有本身的堆棧和局部變量,但線程之間沒有單 獨的地址空間,一個線程死掉就等於整個進程死掉,因此多進程的程序要比多線 程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要 求同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。
iOS中能夠有四種持久化數據的方式:屬性列表、對象歸檔、SQLite3和Core Data;core data可使你以圖形界面的方式快速的定義app的數據模型,同時在你的代碼中 容易獲取到它。coredata提供了基礎結構去處理經常使用的功能,例如保存,恢復, 撤銷和重作,容許你在app中繼續建立新的任務。在使用core data的時候,你不用安裝額外的數據庫系統,由於core data使用內置的 sqlite數據庫。core data將你app的模型層放入到一組定義在內存中的數據對 象。coredata會追蹤這些對象的改變,同時能夠根據須要作相反的改變,例如用 戶執行撤銷命令。當core data在對你app數據的改變進行保存的時候,core data會把這些數據歸檔,並 永久性保存。 mac os x中sqlite庫,它是一個輕量級功能強大的關係數據引擎,也很容易嵌 入到應用程序。能夠在多個平臺使用,sqlite是一個輕量級的嵌入式sql數據庫 編程。與core data框架不一樣的是,sqlite是使用程序式的,sql的主要的API來直接操做數據 表。 Core Data不是一個關係型數據庫,也不是關係型數據庫管理系統(RDBMS)。雖 然Core Dta支持SQLite做爲一種存儲類型,但它不能使用任意的SQLite數據 庫。Core Data在使用的過程種本身建立這個數據庫。Core Data支持對1、對多的關係。
UITableView經過重用單元格來達到節省內存的目的:經過爲每一個單元格指定一 個重用標識符(reuseIdentifier),即指定了單元格的種類,以及當單元格滾出 屏幕時,容許恢復單元格以便重用.對於不一樣種類的單元格使用不一樣的ID,對於簡 單的表格,一個標識符就夠了.
a) 一個整型sql
b) 一個指向整型數的指針數據庫
c) 一個指向指針的的指針,它指向的指針是指向一個整型數編程
d) 一個有10個整型數的數組數組
e) 一個有10個指針的數組,該指針是指向一個整型數的安全
f) 一個指向有10個整型數數組的指針網絡
g) 一個指向函數的指針,該函數有一個整型參數並返回一個整型數數據結構
h) 一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數併發
a) int a; b) int *a; c) int **a; d) int a[10] e) int *a[10]; f) int (*a)[10]; g) int (*a)(int); i) int (*a[10])(int);