1> #import和#include都能完整地包含某個文件的內容,#import能防止同一個文件被包含多次?
2> @class僅僅是聲明一個類名,並不會包含類的完聲明;@class還能解決循環包含的問題
3> #import <> 用來包含系統自帶的文件,#import “”用來包含自定義的文件
1> readwrite:同時生成get方法和set方法的聲明和實現
2> readonly:只生成get方法的聲明和實現
3> assign:set方法的實現是直接賦值,用於基本數據類型
4> retain:set方法的實現是release舊值,retain新值,用於OC對象類型
5> copy:set方法的實現是release舊值,copy新值,用於NSString、block等類型
6> nonatomic:非原子性,set方法的實現不加鎖(比atomic性能高)
1> @property (nonatomic, retain) NSString *name;
- (void)setName:(NSString *)name
{
if(_name != name) {
[_namerelease];
_name= [name retain];
}
}
2> @property(nonatomic, copy) NSString *name;
- (void)setName:(NSString *)name
{
if(_name != name) {
[_namerelease];
_name= [name copy];
}
}
1> 編譯時是NSString類型
2> 運行時是NSData類型
1>常用OC類型:NSString、NSArray、NSDictionary、NSData、NSNumber等
2>OC對象需要手動管理內存,C的基本數據類型不需要管理內存
id聲明的變量能指向任何OC對象
1>每個對象都有一個引用計數器,每個新對象的計數器是1,當對象的計數器減為0時,就會被銷毀
2>通過retain可以讓對象的計數器+1、release可以讓對象的計數器-1
3>還可以通過autorelease pool管理內存
4>如果用ARC,編譯器會自動生成管理內存的代碼
1> 只要調用了alloc、copy、new方法產生了一個新對象,都必須在最後調用一次release或者autorelease
2> 只要調用了retain,都必須在最後調用一次release或者autorelease
3> @property如果用了copy或者retian,就需要對不再使用的屬性做一次release操作
4> 如果用了ARC,另外討論
NSMutableArray*ary=[[NSMutableArrayarray]retain];
NSString*str=[NSStringstringWithFormat:@"test"];// 1
[str retain];// 2
[ary addObject:str]; // 3
NSLog(@"%d", [strretainCount]);
[str retain];//4
[str release];// 3
[str release];// 2
NSLog(@"%d", [strretainCount]);
[ary removeAllObjects];// 1
NSLog(@"%d", [strretainCount]);
結果:3、2、1
1>創建線程的方法
? NSThread
? NSOperationQueue和NSOperation
? GCD
2>主線程中執行代碼
? [self performSelectorOnMainThread: withObject: waitUntilDone:];
? [self performSelector: onThread:[NSThread mainThread] withObject:waitUntilDone:];
? dispatch_async(dispatch_get_main_queue(), ^{
});
3>延時執行
? double delayInSeconds = 2.0;
dispatch_time_t popTime =dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime,dispatch_get_main_queue(), ^(void){
});
? [self performSelector: withObject: afterDelay:];
? [NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo:repeats:];
警告:一定要把英文題目過一遍,有些公司的題目故意弄成英文的!!!
1>淺拷貝:指針(地址)拷貝,不會產生新對象
2>深拷貝:內容拷貝,會產生新對象
1>分類可以在不修改原來類模型的基礎上拓充方法
2>分類只能擴充方法、不能擴充成員變量;繼承可以擴充方法和成員變量
3>繼承會產生新的類
1>分類是有名稱的,類擴展沒有名稱
2>分類只能擴充方法、不能擴充成員變量;類擴展可以擴充方法和成員變量
3>類擴展一般就寫在.m文件中,用來擴充私有的方法和成員變量(屬性)
1> Java的接口中聲明的方法必須都實現
2> Oc的protocol中聲明的方法並不一定要實現
1> KVC是鍵值編碼,可以通過一個字符串的key(屬性名)修改對象的屬性值
2> KVO是鍵值監聽,可以監聽一個對象屬性值的改變
1>兩個對象之間傳遞數據和消息
2>解耦,拆分業務邏輯
1> mutable是可變類型,比如NSMutableArray,可以動態往裡面添加元素
2> immutable是不可變類型,比如NSArray,固定的存儲空間,不能添加元素
1>動態綁定:對象類型在運行時才真正確定
2>多態性
1>通過NSNotification可以給多個對象傳遞數據和消息
2>通過protocol(代理模式)只能給一個對象傳遞數據和消息
1>本地推送:程序內部彈出通知到用戶設備
2>遠程推送:由推送服務器推送通知到用戶設備
多態:父類指針指向子類對象
單粒:保證程序運行過程中,永遠只有一個對象實例
目的是:全局共享一份資源、節省不必要的內存開銷
響應者鏈:
l UIResponder有一個nextResponder屬性,通過該屬性可以組成一個響應者鏈,事件或消息在其路徑上進行傳遞
l 如果UIResponder沒有處理傳給它的事件,會將未處理的消息轉發給自己的nextResponder
1> frame以父控件的左上角為坐標原點
2> bounds以控件本身的左上角為坐標原點
通過一個selector可以找到方法地址,進而調用一個方法
1> OC 1.0沒有垃圾回收
2> OC 2.0有垃圾回收,只能用在Mac上
3> iOS中有ARC機制,是編譯器特性,垃圾回收是運行時特性
1>用來存放NSOperation對象的隊列,可以用來異步執行一些操作
2>一般可以用在網絡請求等耗時操作
延遲加載:比如控制器的view,在第一次用到view時才會調用loadView方法進行創建
從技術角度上分析,一個控制器內部添加2個表格控制器是沒有問題的
從對象屬性上分析,tableView只有一個dataSource屬性。當然,真要使用2個不同的數據源,還是有其他辦法解決的
1>當數組元素需要動態地添加或者刪除時,用NSMutableArray
2>當數組元素固定不變時,用NSArray
1>代理方法:返回tableView每行的高度、監聽tableView每行的選中
2>數據源方法:返回tableView數據的組數和行數、每行顯示什麼數據
沒有限制
系統會默認會不定時地創建和銷毀自動釋放池
當需要精確地控制對象的釋放時間時,需要手動創建自動釋放池
當做一次retain或者copy操作,都有可能增加計數器
NSObject常見的類方法有:alloc、new、description等
像NSStirng的stringWithFormat,NSNumber的numberWithInt
1> 創建項目時,Device選擇Universal
2> 可以創建一套痛用的數據模型
3> 根據iPhone\iPad選擇不同的控制器(iPad可能用UISplitViewController)
4> 根據iPhone\iPad選擇不同的界面
1> atomic是原子性
2> atomic會對set方法的實現進行加鎖
UIView封裝的核心動畫可以通過類方法\block實現
1>屬性列表
2>Preference(NSUserDefaults)
3>鍵值歸檔(NSKeyedArchiver、NSCoding)
4>SQLite數據庫
5>Core Data
NSManagedObject是Core Data中的實體對象
謂詞:可以以一定條件來過濾數組、字典等集合數據,也能用在Core Data的數據查詢中
1> OC是單繼承,沒有多繼承
2> 有時可以用分類和協議來代替多繼承
1> OC沒有類似@private的修飾詞來修飾方法,只要寫在.h文件中,就是公共方法
2> 可以直接在.m文件中(比如類擴展)聲明和實現方法,對編譯器來說是私有的
const int a;
int const a;
const int *a;
int const *a;
int * const a;
int const * const a;
1> 前兩個的作用是一樣:a 是一個常整型數
2> 第三、四個意味著 a 是一個指向常整型數的指針(整型數是不可修改的,但指針可以)
3> 第五個的意思:a 是一個指向整型數的常指針(指針指向的整型數是可以修改的,但指針是不可修改的)
4> 最後一個意味著:a 是一個指向常整型數的常指針(指針指向的整型數是不可修改的,同時指針也是不可修改的)
1> static修飾的函數是一個內部函數,只能在本文件中調用,其他文件不能調用
2> static修飾的全部變量是一個內部變量,只能在本文件中使用,其他文件不能使用
3> static修飾的局部變量只會初始化一次,並且在程序退出時才會回收內存
1>一個應用程序對應一個進程,一個進程幫助程序占據一塊存儲空間
2>要想在進程中執行任務,就必須開啟線程,一條線程就代表一個任務
3>一個進程中允許開啟多條線程,也就是同時執行多個任務
1>堆空間的內存是動態分配的,一般存放對象,並且需要手動釋放內存
2>棧空間的內存由系統自動分配,一般存放局部變量等,不需要手動管理內存
1> tableView的代理一般都是它所屬的控制器,控制器會對它內部的view做一次retain操作
2> 假設tableView也對代理(控制器)做一次retain操作,那麼就出現循環retain問題
1> copy:NSString、Block等類型
2> assign:基本數據類型
3> retain:OC對象類型
每個對象都有一個引用計數器,每個新對象的計數器是1,當對象的計數器減為0時,就會被銷毀
這裡只是簡述:將離開屏幕的cell放到緩存池,重新拿來顯示到屏幕的其他位置(其他自己詳細描述)
1> loadView
? 當第一次使用控制器的view時,會調用loadView方法創建view
? 一般在這裡自定義view
2> viewDidLoad
? 當控制器的view創建完畢時會調用,也就是在loadView後調用
? 一般在這裡添加子控件、初始化數據
3> viewDidUnload
? 當控制器的view因為內存警告被銷毀時調用
? 一般在這裡回收跟界面相關的資源(界面都會銷毀了,跟界面相關的資源肯定不要了)
? 當應用程序接收到系統的內容警告時,就有可能調用控制器的didRece…Warning方法
? 它的默認做法是:
l 當控制器的view不在窗口上顯示時,就會直接銷毀,並且調用viewDidUnload方法
1> M:Model,模型,封裝數據
2> V:View,視圖界面,負責展示數據
3> C:Controller,控制器,負責提供數據(Model)給界面(View)
1> self.是調用get方法或者set放
2> self是當前本身,是一個指向當前對象的指針
3> self->是直接訪問成員變量
1> id類型的指針可以指向任何OC對象
2> nil代表空值(空指針的值)
Timer Profile