天天看點

iOS零散知識點

1.通過UIDevice類的model屬性可以得知目前裝置是什麼,比如模拟器、iPhone、iPad還是iPod。

2.使螢幕不變暗:[[UIApplication sharedApplication] setIdleTimerDisabled:YES];

3.UILabel多行文本 (1)UILabel可以顯示多行文本,它有一個屬性叫numberOfLines,可以制定行的數量,超過則不顯示。 (2)當Label的尺寸超過指定行數對應的高度時,文字會在UILabel的垂直中間的位置上,上下會留白。 (3)當numberOfLines屬性指定為0時,則不限制行數。這時候就需要根據顯示的文本内容來确定對應顯示區域的大小,然後動态設定label的size。 (4)使用這個特性,會比UITextView有一個好處:UITextView顯示内容時上下左右會留白白,造成在确定其Frame時會存在誤差。而UILabel則不存在這個問題。

4.UISegmentControl類中兩個沒有用過的方法:可以對UISegmentControl界面進行定制 (1)-setWidth:forSegmentAtIndex: (2)-setImage:forSegmentAtIndex;

5.去掉iOS桌面圖示上的高亮效果的辦法:在info.plist檔案中加一個字段,Icon already includes gloss effects,選中,意思就是圖示已經包含高亮效果,不用系統再自動添加了。

6.UITableView有兩個屬性,tableHeaderView,tableFooterView,用來添加表視圖的頭和尾,它不同于section的頭和尾。

7.給控件加邊框,圓角: (1)添加QuartzCore.framework (2)代碼: [view.layer setBorderColor:[[UIColor redColor] CGColor]]; [view.layer setBorderWidth:1.0f]; [view.layer setCornerRadius:8.0f]; [view.layer setMaskToBounds:YES];

8.自定義導航欄視圖的幾個方法: (1)添加自定義title視圖:self.navigationItem.titleView = xxx; (2)添加左右自定義按鈕:     UIBarButtonItem *btItem = [[UIBarButtonItem alloc] initWithCustomView:xxx];     self.navigationItem.rightBarButtonItem = btItem;     或者:     self.navigationItem.rightBarButtonItems = [NSArray arrayWithObject:btItem]; (3)定制導航欄背景:     iOS5之後,使用UINavigationBar的setBackgroundImage:forBarMetrics:方法可以定制導航欄背景。     iOS5之前,新增一個UINavigationBar的擴充,重寫drawRect方法,代碼如下:     -(void)drawRect:(CGRect)rect {           UIImage *image = [UIImage imageNamed: @"navBarBK.png"];           [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];       }

9.裁剪圖檔: UIImage *image = xxx; CGImageRef newImageRef = CGImageCreateWithImageInRect(image.CGImage,rect); UIImage *newImage = [[UIImage alloc] initWIthCGImage:newImageRef];

10.讓iOS程式在iOS4.0以及之後沒有多任務,即按下home鍵之後程式直接退出:在info.plist中加入一個字段,Application does not run in bacground,打鈎。

11.擷取info.plist的内容:[[NSBundle mainBundle] infoDictionary];

12.螢幕截圖: UIView *currentView = xxx; UIGraphicsBeginImageContext(currentView.bounds.size); [currentView.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); //儲存到相冊 UIImageWriteToSavedPhotosAlbum(viewImage,nil,nil,nil);

13.Security.framework (1)使用Security.framework可以實作鑰匙串通路,讀寫,但是隻能在真機上使用,模拟器會報錯。可以用來儲存一些私密資料,不用再為加密煩惱。 (2)蘋果封裝了KeychainItemWrapper類,用來對鑰匙串進行操作。該類通過一個表明身份的字元串和通路組字元串來初始化。執行個體方法如下: - (id)initWithIdentifier: (NSString *)identifier accessGroup:(NSString *) accessGroup; - (void)setObject:(id)inObject forKey:(id)key; - (id)objectForKey:(id)key; - (void)resetKeychainItem; (3)鑰匙鍊不會随着程式的解除安裝或者固件重裝被清除,可以用來維護持久的資訊,例如可以判斷某台裝置是否是第一次安裝某軟體。

14.loadView和ViewDidLoad的差別 (1)viewDidLoad方法在控制器view建立成功之後調用,不管是通過nib初始化還是通過loadView方法初始化的。 (2)當view被請求,但是view為nil時,loadView方法就會被調用,一般用于使用代碼來生成控件。

15.在應用中加入WIFI提示框的方法: 如果iOS程式用到了WIFI,在沒有WIFI網絡連接配接的情況下,需要WIFI連接配接提醒,隻需要在info.plist中加入如下兩個鍵值即可: Applicatioin uses Wi-Fi    YES SBUsesNetWork                3

16.通過字元串加載類名: id object = [[NSClassFromString(@"Class1") alloc] init];  效果和下面一樣:id object = [[Class1 alloc] init]; 但是如果Class1不存在,上面的方法會傳回nil,而下面的方法會報錯。

17.UIWebView的使用: (1)使用webView的loadRequest方法,可以加載本地或者網絡的html檔案。 (2)使用UIWebViewDelegate,可以擷取浏覽器網頁開始加載和加載完畢事件,進而可以用來根據這些狀态添加我們自己的UI界面,比如等待視圖。也可以擷取浏覽器目前打開網頁的網址,根據目前網址,我們也可以有自己的UI動作。 (3)通過stringByEvaluatingJavaScriptFromString方法,可以在浏覽器控件外部調用JavaScript腳本。

18.當應用crash時,捕獲錯誤日志: (1)首先聲明發生異常時的回調函數,格式如下:      void MyUncaughtExceptionHandler(NSException *exception) {}      通過NSException對象,可以擷取錯誤時間,錯誤原因,錯誤堆棧。 ()設定捕獲回調:NSSetUncaughtExceptionHandler(&MyUncaughtExceptionHandler);

19.MPMoviePlayerController可以播放線上視訊和音頻(隻支援Http Live Stream協定),以及本地的視訊音頻。支援的格式僅限于蘋果規定支援的格式。

[email protected]和#import的差別: (1)import會包含這個類的所有資訊,包含執行個體變量和方法。而@Class隻是告訴編譯器,聲明的是類的名稱,至于這個類是如何定義的,先不用考慮,後面再告訴你。 (2)一般@Class隻放在interface中,在實作類中,同時需要用@import來告訴編譯器類裡面的具體内容。 (3)使用@Class會增加編譯效率。 (4)使用@Class可以解決循環依賴關系的問題。

21.StringWithFormat和@"str"的差別: (1)@"str",沒有引用計數效果,引用計數為-1,調用retain也沒用。 (2)stringWithFormat使用自動釋放,建立完成時,引用計數為1。

22.iOS中,int是4個位元組,short是2個位元組,char是1個位元組,long int也是4個位元組。一個位元組8位。

[email protected] 、@protected 、@private隻會影響它的子類的通路權限,不會影響到類本身變量的通路權限。

24.在LLVM3.0編譯器中,支援将執行個體變量寫到實作檔案中,可實作私有的成員變量。示例代碼如下: @implementation MyViewController{     NSString *name; }

25.set方法的寫法: if(_value != value){ [_value release]; _value = [value retain]; }

26.RunLoop監視作業系統的輸入源,如果有事件資料,runLoop就發送消息,通知各個對象。它是一個一個事件處理的循環,用來不停的排程工作以及處理輸入事件。使用它的目的是讓你的線程在有工作的時候忙于工作,而沒工作的時候處于休眠狀态。一個UI事件,一個Timer call,delegate call,都會是一個RunLoop。

27.自動釋放池的release和drain的差別: (1)release在GC(自動記憶體回收)環境下是一個空操作,不做任何事情。 (2)在引用計數環境下,drain的行為和release是一樣的,但是在GC環境下,它會調用object_collect_if_needed來觸發GC。

28.NSInteger和int的差別: 在蘋果的API實作中,NSInteger時一個封裝,它會識别目前作業系統的位數,自動但會最大的類型,位數不一樣。封裝可以檢視蘋果文檔。

29.程序間通訊的方式(iOS中基本用不到):管道,信号量,共享記憶體段,消息隊列,以及socket。

30.線程通訊的方式:performSelector。比如: performSelector:onThread:withObject:waitUntilDone: performSelectorOnMainThread:withObject:waitUntilDone: cancelPreviousPerformRequestsWithTarget:selector:object:

31.如果一個NSArray中儲存的是同種類型的對象,并且想對其中的每個對象都調用一個方法,可以使用makeObjectsPerformSelector:withObject:方法。

32.NSTime不是一個精準的定時器,當操作耗時很長或者阻塞,就可能錯過一個點。

33.程序和線程的差別: (1)線程是CPU操作的最小單元,程序是系統資源配置設定時的最小單元。 (2)線程間共享記憶體空間,程序的記憶體空間時獨立的。 (3)程序中包含線程。

34.UIScrollView主要使用了裝飾器模式。Cocoa通過利用NSClipView執行個體裝飾對象提供了滾動技術,讓使用者控制對象的哪個部分是可見的。裝飾器模式通過複合給對象添加了公共的可重用能力,用于替換通過子類化添加這些能力,可以在運作時添加或者配置裝飾器。

35.SQLite相關api: sqlite3_open、sqlite3_prepare_v2、sqlite3_bind_xxx、sqlite3_step、sqlite3_column_xxx、sqlite3_finalize、sqlite3_close。

36.類目(Catagory) (1)使用類目,可以在不子類化的情況下,給一個類添加功能。 (2)當類目中的方法名和類中的方法名沖突時,類目的方法會比類以及子類中方法的優先級高。 (3)如果不提供類名,則類目中定義的方法被視為必須實作的API,如果缺少實作代碼,則編譯器會報警。

37.将NSLog的内容重定向至檔案: freopen([logFilePath cStringUsingEncoding:NSASCCIIEncoding], "a+", stderr);

38.extern關鍵字使用 (1)首先申明一個變量,比如:NSArray *resArray; 然後extern NSArray *resArray;      這樣,在項目裡面的任何類裡面,都可以通路resArray這個變量。      此方法可以在一些需要共享資料的場合使用。 (2)extern "C",表示編譯生成的内部符号使用c約定,大多出現在交叉C編譯環境中。     __cplusplus隻在c++中有定義。

39.從iOS4.0開始,iOS類庫增加了對正規表達式的支援,類名為NSRegularExpression。

40.從iOS5.0開始,iOS類庫增加了對JSON的支援,類名為NSJsonSerialization。

41.在編譯環境中添加"NSZombieEnabled"變量,并且置為YES,可以捕獲EXE_BAD_ACCESS錯誤,能讓錯誤提示的更精細。但是添加了此變量之後,即使對象的引用計數為0,記憶體也不會被回收,應用程式的記憶體使用會一直增加。是以在編譯完成之後,要把這個變量删掉。

42.自定義TableViewCell的背景顔色和選擇後的顔色: 将TableViewCell的backgroundView和SelectBackGroundView修改成指定的View。

43.tableView:willDisplayCell:forRowAtIndexPath方法: 這個方法在TableView要使用cell去繪制row之前調用,這個方法給代理機會去設定基于狀态的屬性,并且早于TableView,比如選擇狀态的顔色或者背景的顔色等。

44.修改UIAlterView預設的Frame高度,使用委托: -(void)willPresentAlertView:(UIAlertView*)alertView {     alertView.frame =CGRectMake(5.f,1.f,100.f,200.f); }

45.由于TableView的cell重用機制,導緻多個圖檔下載下傳事件的回調會指向同一個cell。解決辦法:在圖像下載下傳事件中記錄目前cell的row,同時将cell的tag設定為row,當圖檔下載下傳完畢時,先判斷下載下傳事件中記錄的row和cell的tag是不是一緻,如果一緻,則顯示圖檔到cell上,如果不一緻,則不顯示圖像。

46.UIScrollView可以放大縮小顯示的内容,它有一個參數用來控制縮放的幅度,zoomScale,預設是1.0。

47.讓UIScrollView支援捏合動作: (1)實作代理方法:viewForZoomingInScrollView,傳回目前需要伸縮的視圖對象,比如UIImageView。當兩個手指捏合時,視圖對象的size的值将會被改變。 (2)設定scrollView的最大和最小伸縮倍數,maximumZoomScale、minimumZoomScale。 (3)重寫scrollView的layoutSubviews方法,在此方法中,可以根據需要重置視圖對象的x和y值,後者根據視圖的size屬性,重置scrollView的contentSize。

48.ios自定義鍵盤:UITextField有兩個屬性:inputView,inputAccessoryView。 (1)inputView含義:輸入界面。當你想要某輸入框的輸入鍵盤使用自定義的鍵盤的話,可以自己建立一個鍵盤,然後把鍵盤視圖指派給這個屬性。當點選此輸入框時,彈出的鍵盤就是我們自己的鍵盤了。 (2)inputAccessoryView含義:輔助輸入界面,一般放在鍵盤的上方。可以增加類似于"上一項"、"下一項"、"完成"等功能。