Person * per = [[Person alloc] init]; 此時person 的retainCount的值是1 self.person = per;
在self.person 時,若是是assign,person的 retainCount的值不變,仍爲1 如果:retain,person的retainCount的值加1,變爲2。如果:copy person的retainCount值不變,仍爲1。ios
@implementation Person - (void)setAge:(int)newAge { self.age = newAge; } @end
會死循環,會重複調用本身!self.age 改成_age便可; 而且書寫不規範:setter方法中的newAge應該爲agec++
for (int i = 0; i < 100; i++) { NSString *string = @"xiaomeng"; string = [string lowercaseString]; string = [string stringByAppendingString:@"xyz"]; NSLog(@"%@", string); }
會出現內存泄露,修改以後:程序員
for (int i = 0; i < 100; i++) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *string = @"xiaomeng"; string = [string lowercaseString]; string = [string stringByAppendingString:@"xyz"]; NSLog(@"%@", string); [pool drain]; }
補充:
使用容器的block版本的枚舉器時,內部會自動添加一個AutoreleasePool:web
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { // 這裏被一個局部@autoreleasepool包圍着 }];
在普通for循環和for in循環中沒有,因此,block版本枚舉器更加方便。for循環中遍歷產生大量autorelease變量時,就須要手加局部AutoreleasePool了。objective-c
延伸:堆棧的區別:json
(1)管理方式:對於棧來說,是由編譯器自動管理,無需咱們手工控制;對於堆來講,釋放工做由程序員控制,容易產生 memory leak。設計模式
(2)申請大小:能從棧得到的空間較小,堆是向高地址擴展的數據結構,是不連續的內存區域。堆的大小受限於計算機系統中有效的虛擬內存。因而可知,堆得到的空間比較靈活,也比較大。api
(3)碎片問題:對於堆來說,頻繁的new/delete勢必會形成內存空間的不連續,從而形成大量的碎片,使程序效率下降。 對於棧來說,則不會存在這個問題,由於棧是先進後出的隊列,他們是如此的一一對應,以致於永遠都不可能有一個內存塊從棧中間彈出。數組
(4)分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成 的,好比局部變量的分配。動態分配由alloca函數進行分配,可是棧的動態分配和堆是不一樣的,他的動態分配是由編譯器進行釋放,無需咱們手工實現。xcode
(5)分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧 都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的。
+ (id)Person { Person *person=[Person alloc]init]; return [person autorelease]; //ARC時不用 autorelease }
NSString * str = @"404 | https://www.google.com.hk/"; NSArray *array = [str componentsSeparatedByString:@"|"]; //這是分別輸出的截取後的字符串 for (int i = 0; i<[array count]; ++i) { NSLog(@"%d=%@",i,[array objectAtIndex:i]); }
- (void)sortData:(NSMutableArray *)dataSource{ for (int i = 0; i<[dataSource count]; i++) { for (int j = i+1; j<[dataSource count]; j++) { int a = [[dataSource objectAtIndex:i] intValue]; int b = [[dataSource objectAtIndex:j] intValue]; if (a>b) { [dataSource replaceObjectAtIndex:i withObject:[NSString stringWithFormat:@"%d",b]]; [dataSource replaceObjectAtIndex:j withObject:[NSString stringWithFormat:@"%d",a]]; } } NSLog(@"%@",[dataSource objectAtIndex:i]); } }
UIView:屬於UIkit.framework框架,負責渲染矩形區域的內容,爲矩形區域添加動畫,響應區域的觸摸事件,佈局和管 理一個或多個子視圖。
UIWindow:屬於UIKit.framework框架,是一種特殊的UIView,一般在一個程序中只會有一個UIWindow,但能夠手動建立多個UIWindow,同時加到程序裏面。UIWindow在程序中主要起到三個做用:
CAlayer:屬於QuartzCore.framework,是用來繪製內容的,對內容進行動畫處理依賴與UIView來進行顯示,不能處理用戶事件。UIView和CALayer是相互依賴的,UIView依賴CALayer提供內容,CALayer依賴UIView一共容器顯示繪製內容。
延伸: UIViewController:管理視圖的幾成熟,每一個視圖控制器都有一個自帶的視圖,而且負責這個視圖相關的一切事務。方便管理視圖中的子視圖,負責model與view的通訊;檢測設備旋轉以及內存警告;是全部視圖控制類的積累,定義了控制器的基本功能。
區別:
可讀性方面:基本相同,xml的可讀性比較好
可擴展性方面:都具備很好的擴展性
編碼難度方面:相對而言JSON的編碼比較容易
解碼難度:json的解碼難度基本爲零,xml須要考慮子節點和父節點
數據體積方面:json相對於xml來說,數據體積小,傳遞的速度跟快些
數據交互方面:json與JavaScript的交互更加方便,更容易解析處理,更好的數據交互
數據描述方面:xml對數據描述性比較好
傳輸速度方面:json的速度遠遠快於xml
JSON底層原理:遍歷字符串中的字符,最終根據格式規定的特殊字符,好比{}號,[]號, : 號等進行區分,{}號是一個字典的開始,[]號是一個數組的開始, : 號是字典的鍵和值的分水嶺,最終乃是將json數據轉化爲字典,字典中值多是字典,數組,或字符串而已。
XML底層原理: XML解析經常使用的解析方法有兩種:DOM解析和SAX解析。DOM 採用創建樹形結構的方式訪問XML 文檔,而SAX 採用的事件模型。DOM 解析把 XML 文檔轉化爲一個包含其內容的樹,並能夠對樹進行遍歷。使用 DOM 解析器的時候需 要處理整個 XML文檔,因此對性能和內存的要求比較高。SAX在解析 XML 文檔的時候能夠觸發一系列的事件,當發現給定的tag 的時候,它能夠激活一個回調方法,告訴該方法制定的標籤已經找到。SAX 對內存的要求一般會比較低,由於它讓開發人員本身來決 定所要處理的tag。特別是當開發人員只須要處理文檔中所包含的部分數據時,SAX 這種擴展能力獲得了更好的體現。
SAX與DOM的區別(擴展):
SAX處理的優勢很是相似於流媒體的優勢。分析可以當即開始,而不是等待全部的數據被處理。並且因爲應用程序只是 在讀取數據時檢查數據,所以不須要將數據存儲在內存中。這對於大型文檔來講是個巨大的優勢。事實上,應用程序甚至不 必解析整個文檔;它能夠在某個條件獲得 知足時中止解析。通常來講,SAX 還比它的替代者 DOM 快許多。另外一方面,由 於應用程序沒有以任何方式存儲數據,使用 SAX 來更改數據或在數據流中日後移是不可能的。
DOM 以及廣義的基於樹的處理具備幾個優勢。首先,因爲樹在內存中是持久的,所以能夠修改它以便應用程序能對數 據和結構做出更改。它還能夠在任什麼時候候在樹中上下 導航,而不是像 SAX 那樣是一次性的處理。DOM 使用起來也要簡單 得多。另外一方面,在內存中構造這樣的樹涉及大量的開銷。大型文件徹底佔用系統內存容量的狀況並不鮮見。此外,建立一 棵 DOM 樹多是一個緩慢的過程。
選擇 DOM 仍是選擇 SAX,這取決於下面幾個因素: 應用程序的目的:若是打算對數據做出更改並將它輸出爲 XML,那麼在大多數狀況下,DOM 是適當的選擇。並非說使 用 SAX 就不能更改數據,可是該過程要複雜得多,由於您必須對數據的一份拷貝而不是對數據自己做出更改。 數據容量: 對於大型文件,SAX 是更好的選擇。數據將如何使用:若是隻有數據中的少許部分會被使用,那麼使用 SAX 來將該部分數據提取到應用程序中可能更好。 另外一方面,若是您知道本身之後會回頭引用已處理過的大量信息,那麼 SAX 也許不是恰當的選擇。
對速度的須要:SAX 實現一般要比 DOM 實現更快。
SAX 和 DOM 不是相互排斥的,記住這點很重要。可使用 DOM 來建立 SAX 事件流,也可使用 SAX 來建立 DOM 樹。事實上,用於建立 DOM 樹的大多數解析器實際上都使用 SAX 來完成這個任務!
當程序接到內存警告時ViewController將會收到這個消息:didReceiveMemoryWarning 從iOS3.0開始,不須要重載這個函數,把釋放內存的代碼放到viewDidUnload中去。 這個函數的默認實現是:檢查controller是否能夠安全地釋放它的view,若是view能夠被釋放,那麼這個函數釋放view並調用viewDidUnload。重載這個函數來釋放controller中使用的其餘內存。但要調用這個函數的super實現來容許父類(通常是UIVIewController)釋放view。 若是ViewController保存着view的子view的引用,在早期的iOS版本中,應該在這個函數中來釋放這些引用。而在iOS3.0或更高版本中,應該在viewDidUnload中釋放這些引用。
封裝、繼承、多態。
封裝是面向對象的特徵之一,是對象和類概念的主要特性。 封裝,也就是把客觀事物封裝成抽象的類,而且類能夠把本身的 數據和方法只讓可信的類或者對象操做,對不可信的進行信息隱藏。隱藏對象的屬性和實現細節,僅對外公開接口,提升代碼安全性,封轉程度越高,獨立性越強,使用越方便。 繼承是指這樣一種能力:它可使用現有類的全部功能,並在無需從新編寫原來的類的狀況下對這些功能進行擴展。 經過 繼承建立的新類稱爲「子類」或「派生類」。 被繼承的類稱爲「基類」、「父類」或「超類」 多態性:容許你將父對象設置成爲和一個或更多的他的子對象相等的技術,賦值以後,父對象就能夠根據當前賦值給它的子 對象的特性以不一樣的方式運做。簡單的說,就是一句話:容許將子類類型的指針賦值給父類類型的指針。
多態。主要是將數據類型的肯定由編譯時,推遲到了運行時。這個問題其實淺涉及到兩個概念,運行時和多態。簡單來講, 運行時機制使咱們直到運行時纔去決定一個對象的類別,以及調用該類別對象指定方法。多態:不一樣對象以本身的方式響應相同的消息的能力叫作多態。意思就是假設生物類(life)都用有一個相同的方法-eat;那人類屬於生物,豬也屬於生物,都繼承了life後,實現各自的eat,可是調用是咱們只需調用各自的eat方法。也就是不一樣的對象以本身的方式響應了相同的消 息(響應了eat這個選擇器)。所以也能夠說,運行時機制是多態的基礎。
會引發循環引用。如果retain,在alloc一次以後,若release一次,會致使內訓泄漏,若release兩次會致使兩個對象的dealloc嵌套執行,結果就是都沒有執行成功,最後崩潰! 全部的引用計數系統,都存在循環應用的問題。例以下面的引用關係:
對象a建立並引用到了對象b.
對象b建立並引用到了對象c.
對象c建立並引用到了對象b.
這時候b和c的引用計數分別是2和1。 當a再也不使用b,調用release釋放對b的全部權,由於c還引用了b,因此b的引用計數爲1,b不會被釋放。 b不釋放,c的引用計數就是1,c也不會被釋放。今後,b和c永遠留在內存中。 這種狀況,必須打斷循環引用,經過其餘規則來維護引用關係。常見的delegate每每是assign(ARC用weak)方式的屬性而不是 retain方式的屬性,賦值不會增長引用計數,就是爲了防止delegation兩端產生沒必要要的循環引用。 若是一個UITableViewController對象a經過retain獲取了UITableView對象b的全部權,這個UITableView對象b的 delegate又是a,若是這個delegate是retain方式的,那基本上就沒有機會釋放這兩個對象了。本身在設計使用 delegate模式時,也要注意這點。
與retain配對使用的方法是release,由於retain使retainCount計數加1,release使retainCount計數減1;與 retain語義相反的是release。 與alloc配對使用的是release,由於:alloc是使retainCount計數加1,使retainCount計數減1。與alloc語義相反的是dealloc,由於:alloc是建立一個對象,dealloc是銷燬一個對象。
內存管理要點: Objective-C 使用引用計數機制(retainCount)來管理內存。內存每被引用一次,該內存的引用計數+1,每被釋放一次引用計數-1。當引用計數 = 0 的時候,調用該對象的 dealloc 方法,來完全從內存中刪除該對象。 alloc,allocWithZone,new(帶初始化)時:該對象引用計數 +1;
retain:手動爲該對象引用計數 +1;
copy:對象引用計數 +1;
mutableCopy:生成一個新對象,新對象引用計數爲 1;
release:手動爲該對象引用計數 -1; autorelease:把該對象放入自動釋放池,當自動釋放池釋放時,其內的對象引用計數 -1。
NSAutoreleasePool是經過接收對象向它發送的autorelease消息,記錄該對象的release消息,當自動釋放池被銷燬時,會自動向池中的對象發送release消息。
autorelease 是在自動釋放池被銷燬,向池中的對象發送release。只能釋放本身擁有的對象, 區別是:在引用計數環境下(在不使用ARC狀況下),二者基本同樣,在GC環境下,release 是一個no-op(無效操做),因此不管是否是gc都使用drain。
沒有。autorelease只是延遲釋放,gc是每隔一段時間詢問程序,看是否有無指針指向的對象,如有,就將它回收。他們二者沒有什麼關係。
兩個方法都是異步執行的,layoutSubviews方便數據計算,drawRect方便視圖重繪。 layoutSubviews對subviews從新佈局。layoutSubviews方法調用先於drawRect
線程是進程的基本單位 進程和線程都是由操做系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性。 進程和線程的主要差異在於它們是不一樣的操做系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下 不會對其它進程產生影響,而線程只是一個進程中的不一樣執行路徑。線程有本身的堆棧和局部變量,但線程之間沒有單獨的 地址空間,一個線程死掉就等於整個進程死掉,因此多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較 大,效率要差一些。但對於一些要求同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。
http和scoket通訊的區別: http是客戶端用http協議進行請求,發送請求時候須要封裝http請求頭,並綁定請求的數據,服務器通常有web服務器配合(固然也非絕對)。 http請求方式爲客戶端主動發起請求,服務器才能給響應,一次請求完畢後則斷開鏈接,以節省資源。服務器不能主動給客戶端響應(除非採起http長鏈接技術)。ios主要使用類是NSURLConnection。 scoket是客戶端跟服務器直接使用socket「套接字」進行鏈接,並無規定鏈接後斷開,因此客戶端和服務器能夠保持連 接通道,雙方均可以主動發送數據。通常在遊戲開發或股票開發這種要求即時性很強而且保持發送數據量比較大的場合使用。主要使用類是CFSocketRef。 UDP:是用戶數據報協議:主要用在實時性要求高以及對質量相對較弱的地方,但面對如今高質量的線路不是容易丟包除非 是一些擁塞條件下 ,如流媒體 TCP:是傳輸控制協議:是面鏈接的,那麼運行環境必然要求其可靠性不可丟包有良好的擁塞控制機制如http ftp telnet等。
http的經常使用方式:get,post
就是懶加載模式,只在用到的時候纔去初始化。也能夠理解成延時加載。 我以爲最好也最簡單的一個列子就是tableView中圖片的加載顯示了。 一個延時載,避免內存太高,一個異步加載,避免線程堵塞。
NSURLConnection鏈接後,有一系列委託方法來接受來自服務器的響應和數據,其中接受相應的方法回獲得服務器要傳 回的數據有多大,接受數據的方法會反覆調用來不斷接受服務器數據,若是網絡出問題了,會調用一個方法讓你來作相關處理。
類別:在沒有原類.m文件的基礎上,給該類添加方法; 延展:一種特殊形式的類別,主要在一個類的.m文件裏聲明和實現延展的做用,就是給某類添加私有方法或是私有變量。 兩個的區別:延展能夠添加屬性而且它添加的方法是必需要實現的。延展能夠認爲是一個私有的類目。 繼承和類別在實現中的區別:類別能夠在不獲悉,不改變原來代碼的狀況下往裏面添加新的方法,只能添加,不能刪除修改。而且若是類別和原來類中的方法產生名稱衝突,則類別將覆蓋原來的方法,由於類別具備更高的優先級。 Category只能爲對象添加方法,卻不能添加成員變量的緣由:若是能夠添加成員變量,添加的成員變量沒有辦法初始化.這是語言規則。
objective-c類裏面的方法只有兩種, 靜態方法和實例方法.可是能夠經過把方法的聲明和定義都放在.m文件中來實現一個表面上的私有方法。
有私有變量,能夠經過@private來修飾,或者把聲明放到.m文件中。在Objective‐C中,全部實例變量默認都是私有的,全部實例方法默認都是公有的。
MVC就是Model-View-Controller的縮寫,M指的是業務模型,V指的是用戶頁面,C指的是控制器。MVC是架構模式,是講M和 V的代碼分離,從而使同那個一個程序可使用不一樣的表現形式。 M:表示數據和業務規則,V是用戶看到的並與之交互的頁面,C是接受用戶的輸入並調用M和V取完成用戶需求的 單例,代理,觀察者,工廠模式等 單例模式:說白了就是一個類不經過alloc方式建立對象,而是用一個靜態方法返回這個類的對象。系統只須要擁有一個的 全局對象,這樣有利於咱們協調系統總體的行爲; 代理模式:代理模式給某一個對象提供一個代理對象,並由代理對象控制對源對象的引用.好比一個工廠生產了產品,並不想 直接賣給用戶,而是搞了不少代理商,用戶能夠直接找代理商買東西,代理商從工廠進貨.常見的如QQ的自動回覆就屬於代 理攔截,代理模式在iphone中獲得普遍應用.
觀察者模式: 當一個物體發生變化時,會通知全部觀察這個物體的觀察者讓其作出反應。實現起來無非就是把全部觀察者的 對象給這個物體,當這個物體的發生改變,就會調用遍歷全部觀察者的對象調用觀察者的方法從而達到通知觀察者的目的;
ios-sdk:
Foundation.framework,CoreGraphics.framework,UIKit.framework, MediaPlayer.framework, CoreAudio.framework
第三方庫:
Objective-C中的數字對象NSNumber; Objective-C中的基本類型和C語言中的基本類型同樣.主要有:int,long,float,double,char,void,bool等. 對於基本類型變量,不須要用指針,也不用手動回收,方法執行結束會自動回收.數字對象須要指針,也須要手動回收內存。
程序國際化;
好比:本地化應用程序名稱
1).選中工程,Info—Localizations點擊「+」添加要國際化的語言。
2).在InfoPlist.strings右邊會多出一個三角形,點擊展開可看到InfoPlish.strings(english)和
InfoPlish.strings(chinese)兩個版本的文件;
3).在InfoPlish.strings(english)文件中加入: CFBundleDisplayName ="Program"; 其中「Program」爲英文應用程序名稱,同理在InfoPlish.strings(chinese)文件中加入: CFBundleDisplayName ="應用程序"; 其中「應用程序」爲中文名稱,注意:CFBundleDisplayName加不加雙引號都行;
4).編輯Info.plist,添加一個新的屬性Application has localized display name, 設置其類型爲boolean,並將其 value設置爲YES便可。
程序的編譯過程--連接--- 靜態鏈接庫就是把(lib)文件中用到的函數代碼直接連接進目標程序,程序運行的時候再也不須要其它的庫文件;動態連接就是 把調用的函數所在文件模塊 (DLL)和調用函數在文件中的位置等信息連接進目標程序,程序運行的時候再從DLL中尋找 相應函數代碼,所以須要相應DLL文件的支持。 靜態連接庫和動態連接庫的另一個區別在於靜態連接庫中不能再包含其餘的動態連接庫或者靜態庫,而在動態連接庫中還 能夠再包含其餘的動態或靜態連接庫。
動態的是:運行時才加載到內存中,靜態:編譯時就加載到內存中 靜態方法也就是類方法,不須要release
某個iphone工程進行文件操做有此工程對應的指定的位置,不能逾越。 iOS常見私有api的應用(好比直接發送短信,訪問沙箱以外的磁盤文件).
stringByReplacingOccurrencesOfString:withString:
給定字符串,指定替換字,替換**首先檢測文本編碼格式(只需讀取小部分用來判斷), iphone手機閱讀器中對於PDF格式的閱讀,能夠直接用UIWebView控件顯示,也能夠從網上下到不少直接讀取pdf格式 的代碼
直接從pdf中獲得數據。複雜表格動畫
- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; -(void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation: (UITableViewRowAnimation)animation;- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
如何檢測內存泄露:能夠經過xcode的自帶工具run---start with performance tool裏有instruments下有個leaks工具,啓動此工具 後,運行項目,工具裏能夠顯示內存泄露的狀況,雙擊可找到源碼位置,能夠幫助進行內存泄露的處理。 如何處理:先定位到具體位置, 再解決之。
NSMutableString *mstr=[NSMutableString stringWithFormat:@"ccc"]; NSRange substr = [mstr rangeOfString:@"png"]; //字符串查找,能夠判斷字符串中是否有 if (substr.location != NSNotFound) { [mstr deleteCharactersInRange:substr]; }
區別:C語言,OC語言屬於編譯語言;解釋語言:也能夠理解爲腳本文件,不須要編譯, 編譯型語言寫的程序執行以前,須要一個專門的編譯過程,把程序編譯成爲機器語言的文件,好比exe文件,之後要運行的 話就不用從新翻譯了,直接使用編譯的結果就好了(exe文件),由於翻譯只作了一次,運行時不須要翻譯,因此編譯型語 言的程序執行效率高,但也不能一律而論,部分解釋型語言的解釋器經過在運行時動態優化代碼,甚至可以使解釋型語言的 性能超過編譯型語言。 解釋則不一樣,解釋性語言的程序不須要編譯,省了道工序,解釋性語言在運行程序的時候才翻譯, 好比解釋性basic語言,專門有一個解釋器可以直接執行basic程序,每一個語句都是執行的時候才翻譯。這樣解釋性語言每 執行一次就要翻譯一次,效率比較低。解釋是一句一句的翻譯。
loadView, viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init
分別是在何時調用的?在自定義ViewController的時候這幾個函數裏面應該作什麼工做?1).viewDidLoad 此方法只有當view從nib文件初始化的時候才被調用
2).viewDidUnload當系統內存吃緊的時候會調用該方法,在該方法中將全部IBOutlet(不管是property仍是實例變量) 置爲nil(系統release view時已經將其release掉了)在該方法中釋放其餘與view有關的對象、其餘在運行時建立(但 非系統必須)的對象、在viewDidLoad中被建立的對象、緩存數據等 release對象後,將對象置爲nil(IBOutlet只須要 將其置爲nil,系統release view時已經將其release掉了) dealloc方法,viewDidUnload和dealloc方法沒有關聯,dealloc仍是繼續作它該作的事情
流程應該是這樣:
(loadView/nib文件)來加載view到內存 -->viewDidLoad函數進一步初始化這些view -->內存不足時,調用 viewDidUnload函數釋放views -->當須要使用view時有回到第一步
如此循環
3).viewWillAppear方法,視圖即將過渡到屏幕上時調用,(通常在返回須要刷新頁面時,我都選擇使用代理,因此不多用到)
4).viewWillDisappear方法,這個A->B以後,A在B以後的操做
1).main.m是程序的入口
2).UIApplicationMain()建立應用程序對象,而且爲此對象指定委託,檢測程序的執行,同時開啓事件循環,處理程序接收到的事 件
3).UIApplicationDelegate方法的執行
4).加載window
5).指定根視圖控制器
6).在指定的試圖控制器中添加控件,實現應用程序界面
經過指針實現的
可變與不可變之間的轉化; 可變與可變之間的轉化; 不可變與不可變之間。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:]; // 建立文件系統管理器 NSFileManager *fileManager = [[NSFileManager alloc] init]; // 判斷userData目錄是否存在 if(![fileManager fileExistsAtPath:[NSString stringWithFormat:@"%@/userData", documentsDirectory]]) { // 不存在,建立一個userData目錄 [fileManager createDirectoryAtPath:[NSString stringWithFormat:@"%@/userData", documentsDirectory]withIntermediateDirectories:false attributes:nil error:nil]; }
淺層複製(copy):只複製指向對象的指針,而不復制引用對象自己。//經過對象的指針來訪問這個對象----只賦值地址 深層複製(mutableCopy):複製引用對象自己---再建立一個對象 意思就是有個A對象,複製一份後獲得A_copy對象後,對於淺複製來講,A和A_copy指向的是同一個內存資源,複製的 只不過是是一個指針,對象自己資源 仍是隻有一份,那若是咱們對A_copy執行了修改操做,那麼發現A引用的對象一樣被修改,這其實違背了咱們複製拷貝的一 個思想。深複製就好理解了,內存中存在了兩份獨立對象自己。//當修改A時,A copy不變。
這個我我的簡單理解就是可動態添加修改和不可動態添加修改同樣。好比NSArray和 NSMutableArray。前者在初始化後的內存控件就是固定不可變的,後者能夠添加等,能夠動態申請新的內存空間。
[_instance release],_instance = nil;
變量的做用域不一樣,@protected 該類和全部子類中的方法能夠直接訪問這樣的變量,這是默認的;@private 該類中的方法能夠訪問這樣的變量,子類不能夠; @public除了本身和子類方法外,也能夠被其餘類或者其餘模塊中的方法訪問;@package 目前還沒有得出結論
不能夠;
---NSRunLoop,NSTimer須要本身實現----GCD的返回主線程的方法,看前面的題
run loop,正如其名稱所示,是線程進入和被線程用來響應事件以及調用事件處理函數的地方。須要在代碼中使用控制語 句實現run loop的循環,也就是說,須要代碼提供while 或者 for循環來驅動run loop。在這個循環中,使用一個 runloop對象[NSRunloop currentRunloop]執行接收消息,調用對應的處理函數。
獲取數據,刷新頁面
沙盒是某個iphone工程進行文件操做有此工程對應的指定的位置,不能逾越。 包括:四個文件夾:documents,tmp,app,Library。 手動保存的文件在documents文件裏。 Nsuserdefaults保存的文件在tmp文件夾裏。
Documents 目錄:您應該將全部de應用程序數據文件寫入到這個目錄下。這個目錄用於存儲用戶數據或其它應該按期備 份的信息。AppName.app 目錄:這是應用程序的程序包目錄,包含應用程序的自己。因爲應用程序必須通過簽名,因此 您在運行時不能對這個目錄中的內容進行修改,不然可能會使應用程序沒法啓動。Library 目錄:這個目錄下有兩個子目 錄:Caches 和 PreferencesPreferences 目錄包含應用程序的偏好設置文件。您不該該直接建立偏好設置文件,而是 應該使用NSUserDefaults類來取得和設置應用程序的偏好.Caches 目錄用於存放應用程序專用的支持文件,保存應用程 序再次啓動過程當中須要的信息。tmp 目錄:這個目錄用於存放臨時文件,保存應用程序再次啓動過程當中不須要的信息。
獲取這些目錄路徑的方法:
1).獲取家目錄路徑的函數:
NSString *homeDir = NSHomeDirectory();
2).獲取Documents目錄路徑的方法:
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docDir = [paths objectAtIndex:0];
3).獲取Caches目錄路徑的方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *cachesDir = [paths objectAtIndex:0];
4).獲取tmp目錄路徑的方法:
NSString *tmpDir = NSTemporaryDirectory();
5).獲取應用程序程序包中資源文件路徑的方法:
例如獲取程序包中一個圖片資源(apple.png)路徑的方法:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@」apple」 ofType:@」png」]; UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
代碼中的mainBundle類方法用於返回一個表明應用程序包的對象。
XMPP(Extensible Messaging and Presence Protocol,前稱)是一種以XML爲基礎的開放式實時通訊協議,是 經由互聯網工程工做小組(IETF)經過的互聯網標準。簡單的說,XMPP就是一種協議,一種規定。就是說,在網絡上傳 東西,要創建鏈接,TCP/IP鏈接,創建後再傳東西,而XMPP就是規定你傳的東西的格式。XMPP是基於XML的協議。 優勢
開放: XMPP協議是自由、開放、公開的,而且易於瞭解。 並且在客戶端 、 服務器 、 組件 、 源碼庫等方面,都已經各自有多種實現。 標準: 互聯網工程工做小組( IETF )已經將Jabber的核心XML流協議以XMPP之名,正式列爲承認的實時通訊及Presence技術。 而XMPP的技術規格已被定義在RFC 3920及RFC 3921 。 任何IM供應商在遵循XMPP協議下,均可與Google Talk實現鏈接。 證明可用: 第一個Jabber(如今XMPP)技術是Jeremie Miller在1998年開發的,如今已經至關穩定;數以百計的開發者爲XMPP技術而努 力。 今日的互聯網上有數以萬計的XMPP服務器運做着,並有數以百萬計的人們使用XMPP實時傳訊軟件。
分散式: XMPP網絡的架構和電子郵件十分相像;XMPP核心協議通訊方式是先建立一個stream,XMPP以TCP傳遞XML數據流,沒有 中央主服務器。 任何人均可以運行本身的XMPP服務器,使我的及組織可以掌控他們的實時傳訊體驗。
安全: 任何XMPP協議的服務器能夠獨立於公衆XMPP網絡(例如在企業內部網絡中),而使用SASL及TLS等技術的可靠安全性,已自 帶於核心XMPP技術規格中。
可擴展: XML 命名空間的威力可以使任何人在覈心協議的基礎上建造定製化的功能;爲了維持通透性,常見的擴展由XMPP標準基金會 。
彈性佳: XMPP除了可用在實時通訊的應用程序,還能用在網絡管理、內容供稿、協同工具、文件共享、遊戲、遠程系統監控等。
多樣性: 用XMPP協議來建造及佈署實時應用程序及服務的公司及開放源代碼計劃分佈在各類領域;用XMPP技術開發軟件,資源及支持的 來源是多樣的,使得使你不會陷於被「綁架」的困境。
缺點
數據負載過重:
隨着一般超過70%的XMPP協議的服務器的數據流量的存在和近60%的被重複轉發,XMPP協議目前擁有一個大型架空中存在的 數據提供給多個收件人。 新的議定書正在研究,以減輕這一問題。
沒有二進制數據:
XMPP協議的方式被編碼爲一個單一的長的XML文件,所以沒法提供修改二進制數據。 所以, 文件傳輸協議同樣使用外部的 HTTP。 若是不可避免,XMPP協議還提供了帶編碼的文件傳輸的全部數據使用的Base64 。 至於其餘二進制數據加密會話 (encrypted conversations)或圖形圖標(graphic icons)以嵌入式使用相同的方法。 7九、談談對性能優化的見解,如何作? 控制好內存,不用的內存實時釋放;冗餘代碼;用戶體驗度;耗時操做,開線程進行處理 80、寫一個遞歸方法:計算N的階乘,而後將計算結果進行存儲。以便應用退出後下次啓動可直接獲取該值。 開啓一個線程,在線程種實現遞歸的方法,將結果存到本地,下次運行時先看本地,沒有在運行這個遞歸方法。
-[AppDelegate application:willFinishLaunchingWithOptions:] -[AppDelegate application:didFinishLaunchingWithOptions:] -[AppDelegate applicationDidBecomeActive:] 退到後臺: -[AppDelegate applicationWillResignActive:] -[AppDelegate applicationDidEnterBackground:] 回到前臺: -[AppDelegate applicationWillEnterForeground:] -[AppDelegate applicationDidBecomeActive:] ViewController之間加載頁面: -[mainViewController viewDidLoad] -[mainViewController viewWillAppear:] -[mainViewController viewWillLayoutSubviews] -[mainViewController viewDidLayoutSubviews] -[mainViewController viewDidAppear:] 退出當前頁面: -[mainViewController viewWillDisappear:] -[mainViewController viewDidDisappear:] 返回以前頁面: -[mainViewController viewWillAppear:] -[mainViewController viewWillLayoutSubviews] -[mainViewController viewDidLayoutSubviews] -[mainViewController viewDidAppear:]
所謂值傳遞,就是說僅將對象的值傳遞給目標對象,就至關於copy;系統將爲目標對象從新開闢一個徹底相同的內存空間。所謂引用傳遞,就是說將對象在內存中的地址傳遞給目標對象,就至關於使目標對象和原始對象對應同一個內存存儲空間。此時,如 果對目標對象進行修改,內存中的數據也會改變。
NSArray更安全,當同時被訪問時,NSArray是不可改變
isKindOfClass、isMemberOfClass、selector
做用分別是什麼isKindOfClass
做用是某個對象屬於某個類型,包括繼承的類型
isMemberOfClass:
某個對象確切屬於某個類型,是否是具體的實例
selector:
經過方法名,獲取在內存中的函數的入口地址
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"a string value" forKey:@"akey"]; NSLog(@"%@", [dict objectForKey:@"akey"]); [dict release];
打印輸出 a string value,而後崩潰----緣由:便利構造器建立的對象,以後的release,會形成過分釋放
SEL是「selector」的一個類型,表示一個方法的名字-------就是一個方法的入口地址
id是一個指向任何一個繼承了Object(或者NSObject)類的對象。須要注意的是id是一個指針,因此在使用id 的時候不須要加*。
@:OC中的指令符
.mm是oc和C++混編類型文件後綴,給編譯器識別的。
版本控制 svn,cvs 是兩種版控制的器,須要配套相關的svn,cvs服務器。scm是xcode裏配置版本控制的地方。版本控制 的原理就是a和b同時開發一個項目,a寫完當天的代碼以後把代碼提交給服務器,b要作的時候先從服務器獲得最新版本, 就能夠接着作。 若是a和b都要提交給服務器,而且同時修改了同一個方法,就會產生代碼衝突,若是a先提交,那麼b提交 時,服務器能夠提示衝突的代碼,b能夠清晰的看到,並作出相應的修改或融合後再提交到服務器。