iOS小結(jié)

一.內(nèi)存管理情況

1- autorelease,當(dāng)用戶的代碼在持續(xù)運(yùn)行時,自動釋放池是不會被銷毀的,這段時間內(nèi)用戶可以安全地使用自動釋放的對象。當(dāng)用戶的代碼運(yùn)行告一段 落,開始等待用戶的操作,自動釋放池就會被釋放掉(調(diào)用dealloc),池中的對象都會收到一個release,有可能會因此被銷毀。
2-成員屬性:
readonly:不指定readonly,默認(rèn)合成getter和setter方法。外界毫不關(guān)心的成員,則不要設(shè)置任何屬性,這樣封裝能增加代碼的獨(dú)立性和安全性。相當(dāng)于私有成員?
assign:表示只進(jìn)行簡單的賦值,不會發(fā)送retain消息。
retain:會向舊值發(fā)送release消息,向新值發(fā)送retain消息。
copy:向舊值發(fā)release消息,向新值發(fā)送copy消息。
3-引用計(jì)數(shù)特殊情況:
NSArray:當(dāng)把一個對象添加到NSArray時,對象的引用計(jì)數(shù)會加1,移除時會減1。
UIView:addGestureRecognizer會對手勢識別器的引用計(jì)數(shù)加1,removeGestureRecognizer會減1。

二 .圖形API

這個講的好,清晰明確:http://www.cocoachina.com/bbs/read.php?tid=77731&page=1
1-Quartz2D,的繪圖總是發(fā)生在圖形環(huán)境(Graphics Context)中。視圖會在調(diào)用drawRect:方法進(jìn)行繪圖之前,創(chuàng)建好圖形環(huán)境,
通過UIGraphicsGetCurrentContext函數(shù)來獲得這個圖形環(huán)境。
如果直接在圖像或者PDF上繪圖,需要調(diào)用CGBitmapContextCreate或者CGPDFContextCreate函數(shù)來創(chuàng)建圖形環(huán)境。
Quartz2D繪圖的基礎(chǔ)元素是路徑。路徑可以是一些基礎(chǔ)幾何形狀,也可以是這些幾何形狀的組合。
當(dāng)需要創(chuàng)建一條路徑時,應(yīng)當(dāng)調(diào)用CGContextBeginPath函數(shù);
當(dāng)需要將路徑繪制的起點(diǎn)移動到一個位置時,應(yīng)當(dāng)調(diào)用CGContextMoveToPoint函數(shù);
當(dāng)想繪制一條線段時,應(yīng)當(dāng)調(diào)用CGContextAddLineToPoint。 CTM(當(dāng)前變換矩陣)將繪圖從用戶空間映射到設(shè)備控件。
當(dāng)圖形環(huán)境剛剛創(chuàng)建時,CTM初始化為一個單位矩陣。
對CTM進(jìn)行平移變換應(yīng)當(dāng)調(diào)用CGContextTranslateCTM函數(shù),進(jìn)行旋轉(zhuǎn)變換應(yīng)當(dāng)調(diào)用CGContextRotateCTM函數(shù),進(jìn)行縮放變換應(yīng)當(dāng)調(diào)用CGContextScaleCTM函數(shù)。

2-UIBezierPath

使用UIBezierPath繪圖的好處:
-采用系統(tǒng)坐標(biāo)系
-在Core Graphics的基礎(chǔ)上封裝,具有Core Graphics的主要功能,無需考慮圖形環(huán)境。

    UIBezierPath* pathLines = [UIBezierPath bezierPath];
    [pathLines moveToPoint:point1]; // 移動到point1位置
    [pathLines addLineToPoint:point2]; // 畫一條從point1到point2的線
    pathLines.lineWidth = 5.0; // 線寬
    [UIColor redColor] set]; // 顏色設(shè)置
    [pathLines stroke]; // 開始描繪

在同一UIBazierPath中,只能采用相同的顏色和線寬。
可以調(diào)用closePath,從當(dāng)前點(diǎn)畫一條直線到當(dāng)前子路徑的初始點(diǎn)。如果要填充路徑,應(yīng)當(dāng)使用fill方法,此方法會填充路徑中得所有封閉子路徑。

三.容器

-NSArray和NSMutableArray
+array:創(chuàng)建一個空數(shù)組
+arrayWithArray:從另一個數(shù)組創(chuàng)建新的數(shù)組
+arrayWithContentsOfFile:讀文件創(chuàng)建數(shù)組
+arrayWithObject:創(chuàng)建一個數(shù)組,其中包含一個給定對象
+arrayWithObjects
+arrayWithObjects:count: 從C數(shù)組創(chuàng)建
-containsObject:是否包含一個元素
-count:數(shù)量
-lastObject:返回最后一個
-objectAtIndex:返回某一個
-objectsAtIndexes:返回一組,類型為NSArray
-indexOfObject:返回對象索引
-arrayByAddingObject:原數(shù)組最后加一個對象,產(chǎn)生一個新的數(shù)組
-arrayByAddingObjectsFromArray:在原數(shù)組的最后添加另一個數(shù)組中的所有對象,產(chǎn)生一個新數(shù)組
-subarrayWithRange:抽取原數(shù)組中得一部分,產(chǎn)生一個新的數(shù)組
-isEqualToArray:比較兩個數(shù)組是否相同
-writeToFile:atomically:保存數(shù)組至一個文件
-writeToURL:atomically:保存數(shù)組至一個URL
-addObject:在數(shù)組最后添加一個對象
-addObjectsFromArray:在原數(shù)組最后添加另一個數(shù)組的全部對象
-insertObject:atIndex:向原數(shù)組制定位置添加一個對象
-insertObjects:atIndexes:向原數(shù)組中一系列位置添加一系列對象
-removeAllObjects:移除數(shù)組中的全部對象
-removeLastObject:移除數(shù)組中最后一個對象
-removeObject:移除一個對象
-removeObjectAtIndex:移除位于指定位置的對象
-removeObjectsAtIndexes:移除位于一系列位置的對象
-replaceObjectAtIndex:withObject用給定對象替換位于指定位置的對象
-replaceObjectsAtIndexes:withObjects:多對象,多位置版本
-setArray:用另一個數(shù)組中的所有對象來替換當(dāng)前數(shù)組中的所有對象
-NSDictionary與NSMutableDictionary
+dictionary
+dictionaryWithContentsOfFile
+dictionaryWithContentsOfURL
+dictionaryWithDictionary
+dictionaryWithObject:forKey
+dictionaryWithObjects:forKeys
+dictionaryWithObjectsAndKeys
-count:數(shù)量
-allKeys:返回一個數(shù)組,包含字典中的所有關(guān)鍵字。
-allKeysForObject:返回一個數(shù)組,包含所有對應(yīng)到給定對象的關(guān)鍵字。
-valueForKey:通過字符串查找數(shù)值。
-writeToFile:atomically
-writeToURL:atomically
-setValue:forKey: 加鍵-值對
-addEntriesFromDictionary: 添加另一個字典中得所有條目
-setDictionary:將原字典中條目設(shè)置為另一個字典中得所有條目
-removeObjectForKey:移除一個關(guān)鍵字的對應(yīng)條目
-removeAllObjects:移除所有條目
-removeObjectsForKeys:移除一系列關(guān)鍵字的對應(yīng)條目

四.文件系統(tǒng)

1- 概述
bundle(沙盒):一個應(yīng)用只能在自己的沙盒中讀取或存儲文件,而不能操作其他沙盒中的文件。好處:保護(hù)應(yīng)用的隱私不受侵犯,保護(hù)系統(tǒng)文件的安排,應(yīng)用刪除后相關(guān)文件也能被全部清除。
每個應(yīng)用都有自己的沙盒,沙盒的根目錄的獲取方法是NSHomeDirectory()。
根目錄下的內(nèi)容:
-.app文件,實(shí)際上是一個文件夾,包含了可執(zhí)行文件、Nib文件、圖片資源、plist等。XCode中能看到的資源,及編譯后的可執(zhí)行文件,都封裝在app中。
-Documents文件夾,用于存放你的應(yīng)用所產(chǎn)生的數(shù)據(jù),該文件夾可通過iTunes備份,可以存儲游戲進(jìn)度等。
-Library文件夾,用于存放用戶偏好和臨時文件。
-tmp文件夾是系統(tǒng)的中轉(zhuǎn)站。
2-文件管理器
NSFileManager,defaultManager()返回一個文件管理器的單例(多線程下不安全)。init(),在多線程編程中應(yīng)盡量使用init()。
代理方法:-fileManager:shouldRemoveItemAtPath和-fileManager:shouldRemoveItemAtURL在移除操作之前被調(diào)用。
-removeItemAtPath:error:刪除位于指定路徑的文件、連接、目錄(及其所有子目錄、文件)。
-removeItemAtURL:error:同上。
-contentOfDirectoryAtPath:查找所有位于給定路徑的子路徑和文件。返回值為一個數(shù)組,其中包含了NSString對象。查找只在當(dāng)前目錄進(jìn)行,不會進(jìn)入下一層目錄。
-subpathsAtPath:查找給定路徑下的所有子路徑。深度查找,不限于當(dāng)前層,也會查找package的內(nèi)容。
-fileExistsAtPath:判斷文件是否位于一個路徑下面。
-isReadableFileAtPath:查詢文件的可讀性
-isWritableFileAtPath:可寫性
-isExecutableFileAtPath:查詢文件的可執(zhí)行性
-isDeletableFileAtPath:可刪除性
3-NSString的路徑功能
-pathWithComponent:參數(shù)是一堆components構(gòu)成的數(shù)組,返回的路徑是由這些components連接而成的路徑字符串,相鄰components之間用/隔開。
-pathComponents:返回一個數(shù)組,包含路徑中的components。
-fileSystemRepresentation:返回C字符串
-isAbsolutePath:判斷是否為絕對路徑
-pathExtension:返回文件的擴(kuò)展名,沒有的就返回空字符串
-stringByAppendingPathComponents :向現(xiàn)有路徑添加一個component。斜杠/會被自動加上
-stringByAppendingPathExtension:向現(xiàn)有路徑加上文件的擴(kuò)展名
-stringByDeletingLastPathComponent:移除最后一個路徑component
-stringByDeletingPathExtension:刪除路徑擴(kuò)展名
-stringByAppendingPaths:參數(shù)為一個數(shù)組,此方法將數(shù)組中的字符串對象作為路徑一次添加到源字符串后面。
例子:
NSString *homePath = NSHomeDirectory();
NSString *docPath = [homePath stringByAppendingFormat:@"/Documents"];

五.UIAlertController

    UIAlertController * alterVC = [UIAlertController alertControllerWithTitle:@"標(biāo)題" message:alter preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction * veryfiAction  = [UIAlertAction actionWithTitle:@"確認(rèn)" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {      
        NSLog(@"確認(rèn)");
    }]; 
    [alterVC addAction:veryfiAction];
    [self.window.rootViewController presentViewController:alterVC animated:YES completion:nil];

六.旋轉(zhuǎn)

1- interfaceOrientation屬性查詢當(dāng)前的界面方向。
2- rotatingHeaderView方法來查詢當(dāng)前導(dǎo)航視圖。
3- rotatingFooterView來查詢當(dāng)前的標(biāo)簽條。

七.快速撥打電話接口

openURL能幫助你運(yùn)行Maps,SMS,Browser,Phone甚至其他的應(yīng)用程序。這是Iphone開發(fā)中我經(jīng)常需要用到的一段代碼,它僅僅只有一行而已。

[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8004664411"]; 
這個程序通過基礎(chǔ)的協(xié)議支持撥打電話的功能。

八.區(qū)分設(shè)備類型的方法

打電話功能只有iPhone支持,對于其他設(shè)備對應(yīng)按鈕應(yīng)該禁用。

  1. 用[UIDevice currentDevice].model,這個返回的是一個NSString,你可以做如下判斷就能知道設(shè)備是iPad還是iPhone.
        if ([UIDevice currentDevice].model            
         rangeOfString:@"iPad"].location != NSNotFound) { 
          NSLog(@"This is an iPad!"); 
   } 
  1. 用UI_USER_INTERFACE_IDIOM()方法,這是系統(tǒng)定義的一條宏。使用方法也很簡單。
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
    NSLog(@"This is an iPad!");
    }

九.并發(fā)編程

1-GCD-Grand Central Dispatch,GCD使用隊(duì)列來管理多個任務(wù),而每個任務(wù)是以塊(其定義類似于函數(shù))來描述的。GCD從隊(duì)列中讀取這些要完成的任務(wù),然后其多核執(zhí)行 引擎負(fù)責(zé)將這些任務(wù)分配給它所管理的線程。和手動線程管理相比,GCD能極大地優(yōu)化線程管理,并極大地減少創(chuàng)建和銷毀線程所帶來的額外開銷。除了在多核系 統(tǒng)上得性能改進(jìn)之外,GCD還能幫助提高應(yīng)用的響應(yīng)速度,并讓代碼更為干凈,易于維護(hù)。
2-NSOperationQueue-操作隊(duì)列,可以極大地減少開發(fā)者在并發(fā)編程中的負(fù)擔(dān),并且操作隊(duì)列有一套Objective-C的API,使用起來方便。
基本操作單位-NSOperation,操作。
操作是封裝了一個與任務(wù)有關(guān)的代碼與數(shù)據(jù)的抽象類,需要繼承NSOperation,并且描述相關(guān)的任務(wù)。操作對象是一次性的,它只能執(zhí)行一次,下一次,需要創(chuàng)建一個新的實(shí)例。
可以通過addDependency:方法為操作添加相互依賴性。假設(shè)操作A依賴于操作B,如果操作B沒有結(jié)束,操作A就不會開始執(zhí)行。完成是指 執(zhí)行完,或者取消了操作。有時需要對操作是否成功作出判斷。通過removeDependency:方法來移除操作的相互依賴性。
操作的一個屬性是isConcurrent。當(dāng)使用操作隊(duì)列來管理這些操作時,isConcurrent應(yīng)當(dāng)設(shè)置為NO,這時應(yīng)當(dāng)重載 NSOperation的main函數(shù)(在類中保存controller對象-weak,并在main中調(diào)用controller的方法)。 isReady屬性用于描述操作是否已經(jīng)可以開始執(zhí)行,isExecuting屬性表示操作是否正在執(zhí)行當(dāng)中,isFinished屬性表示操作是否順利 完成,isCancelled屬性則表示操作已經(jīng)取消。
可以在操作運(yùn)行中取消它的運(yùn)行,只需要給它發(fā)送cancel消息即可。在繼承NSOperation類時,也需要支持cancel方法。
如果只需要簡單的操作,不想繼承NSOperation類,可以使用NSInvocationOperation類,這個類中的-initWithTarget:selector:object:方法能幫助你方便地選擇人物的對象和相應(yīng)的功能。
操作的執(zhí)行順序取決于各自的優(yōu)先級和相互之間的依賴性。
操作隊(duì)列有兩種方式來執(zhí)行其中的操作。第一種是開辟新線程來運(yùn)行這些操作,第二種則是通過GCD來運(yùn)行這些操作。但是無論如何,都不需要手動管理 線程。盡量使用操作隊(duì)列,只有在操作隊(duì)列的效率明顯不足時才轉(zhuǎn)向GCD。因?yàn)椴僮麝?duì)列是封裝在GCD的基礎(chǔ)之上的,雖然增加了一些額外開銷,但是也具有更 加完善的功能。例子是TestNSOperation。

十.忙碌指示器

    UIActivityIndicator。
UIActivityIndicatorView *activityIndicatior = [UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhiteLarge]; 
    activityIndicator.center = CGPointMake(512, 384); 
    [self.view addSubview: activityIndicator]; 
    [activityIndicator startAnimating];  
    [activityIndicator stopAnimating]; 
    [activityIndicator removeFromSuperView]; 

十一.媒體播放

1- 音頻
[1] 音樂往往是存儲在iPod曲庫(注意位置)中的,可以通過媒體選擇器(media picker)或者媒體查詢(media query)讀取,然后用音樂播放器MPMusicPlayerController播放。

MPMusicPlayerController *musicPlayer = [MPMusicPlayerController applicationMusicPlayer]; 
[musicPlayer setShufleMode: MPMusicShuffleModeSongs]; 
[musicPlayer setRepeatMode: MPMusicRepeatModeAll]; 
[musicPlayer setQueueWithQuery: [MPMediaQuery songsQuery]; 
[musicPlayer play]; 

applicationMusicPlayer返回的播放器,在你的應(yīng)用中播放音樂。它不會影響到iPod播放器,也不能從iPod播放器重獲取信息。
iPodMusicPlayer返回的是iPod播放器,在你推出應(yīng)用后,所有的設(shè)置都會影響到之后設(shè)備上的iPod播放器。
獲得音樂播放器后,需要為它設(shè)置一個播放隊(duì)列。可以用setQueueWithQuery:放方法,通過媒體查詢MPMediaQuery來設(shè)置 播放隊(duì)列,也可以用setQueueWithItemCollection:方法,通過MPMdiaItemCollection來設(shè)置播放隊(duì)列。
重復(fù)模式repeatMode可以設(shè)置為不重復(fù)、重復(fù)當(dāng)前曲目、或整個播放列表;亂序播放shuffleMode可以設(shè)置為不亂序、亂序播放曲目或亂序播放專輯;音量volume的設(shè)置與音頻播放器一樣。
skipToNextItem跳到下一首,skipToPreviousItem跳到上一首,skipToBegin跳到第一首。
對應(yīng)的宏都是以MPMusic開頭。

    [2] 利用系統(tǒng)聲音服務(wù)來播放短暫音效(時長30秒以內(nèi)),并震動:   
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);  
    播放指定音效:
NSURL *fileURL = [NSURL fileURLWithPath: path isDirectory: NO];  
// 創(chuàng)建音效ID 
SystemSoundID soundID; 
AudioServiceCreateSystemSoundID((CFURLRef) fileURL, &soundID); 
// 播放聲音 
AudioServicesPlaySystemSound(soundID); 

[3] 音頻播放器

   沒有時長限制
NSURL *fileURL = [NSURL fileURLWithPath: path isDirectory: NO]; 
// 用URL來初始化音頻播放器-播放的不是iPod曲庫中的音樂 
AVAudioPlayer* player = [AVAudioPlayer alloc] initWithContentsOfURL: fileURL error: NO]; 
// 準(zhǔn)備播放 
[player prepareToPlay]; 
// 設(shè)置代理 
[player setDelegate: self]; 
    方法:play、pause、stop。可以通過playing屬性查詢播放器是否正在播放當(dāng)中,可以通過volume屬性來修改和查詢播放器的播放增益(從0.0到1.0),可通過setting屬性查詢播放器其他設(shè)置。

    duration表示音頻的時間長度, currentTime表示當(dāng)前播放到的時間。播放結(jié)束后可以通過代理方法audioPlayerDidFinishPlaying:來處理播放后設(shè)置。 

2- 視頻
視頻播放可以采用網(wǎng)頁視圖(UIWebView)進(jìn)行嵌入式播放(能播放YouTube視頻),或者采用電影播放器(MPMoviePlayerController)進(jìn)行播放。
[1] 電影播放器

MPMoviePlayerController *player = [MPMoviePlayerController alloc]initWithContentURL: url]; 
    // 設(shè)置播放器的大小,并將其加入視圖中 
    [player.view setFrame: rectFrame]; 
    [self.view addSubView: player.view]; 
    播放器的背景視圖backgroundView。 
    全屏[player setFullscreen: YES animated: YES]; 
    播放另一個影片[player setContentURL: newURL]; 
    [player requestThumbnailImagesAtTimes:arrayTimes timeOption:MPMovieTimeOptionNearestKeyFrame]; // 表示播放器不會在你所指定的時間去截取預(yù)覽,而是在絕對時間的附近幾幀中尋找效果最好的幀做為預(yù)覽。 
scalingMode規(guī)定了影片的縮放模式。   
initialPlaybackTime用來控制視頻開始播放的時間,單位是秒。

如果視頻源在網(wǎng)絡(luò)上,那么需要正確設(shè)置服務(wù)器端的mimeType。

十二.運(yùn)行環(huán)-runloop

運(yùn)行環(huán)作用于一個iOS應(yīng)用的整個生命周期。它負(fù)責(zé)監(jiān)視各種輸入事件,并且在合適的時候?qū)@些輸入進(jìn)行分配。應(yīng)用的每一個線程都有且僅有一個運(yùn)行環(huán)。你自己不需要創(chuàng)建也不需要銷毀運(yùn)行環(huán),但是可以通過currentRunLoop方法來獲取當(dāng)前的運(yùn)行環(huán)。

十三.定時器

由于運(yùn)行環(huán)機(jī)制,定時器的精度不高,只能用于一般性延時。
例子:拼圖游戲,DeskViewController.m。
NSObject類的定時方法。
performSelector: withObject: afterDelay: 運(yùn)行方法,參數(shù),時間(秒)。
performSelectorOnMainThread: withObject: waitUntilDone: 在主線程中,運(yùn)行參數(shù)selector所指定的方法,如果waitUntilDone參數(shù)為YES,那么當(dāng)前線程會被阻攔,直到selector運(yùn)行完。
performSelector: onThread: withObject: waitUntilDone:同上,但不一定在主線程中運(yùn)行。
performSelectorInBackground: withObject: 開啟一個新線程,用于運(yùn)行selector方法,selector方法應(yīng)負(fù)責(zé)線程的初始化。
cancelPreviousPerformRequestsWithTarget:取消與一個目標(biāo)相關(guān)的所有計(jì)劃好的動作。
cancelPreviousPerformRequestsWithTraget: selector: object只取消特定的計(jì)劃動作。

十四.隨機(jī)數(shù)

0~1之間隨機(jī)數(shù)

CG_INLINE float genRandomNum() 
{ 
    return (float)arc4random/ARCRANDOM_MAX; 
} 

十五.地圖與連接服務(wù)器

[1] 添加框架MapKit.framework。使用MKMapView來呈現(xiàn)地圖。注意應(yīng)當(dāng)直接使用此類,而不是繼承之。如果希望在MKMapView類之上添加功能,可以使用MKMapViewDelegate協(xié)議。

初始化:
MKMapView *mapView = [MKMapView alloc] initWithFrame: rect]; 
    初始化之后并不直接顯示,還需要指定顯示的地圖區(qū)域:
CLLocationCoordinate2D coordinate; 
coordinate.latitude = latitudeValue; // 緯度 
coordinate.longtitude = longtitudeValue; // 精度 
// 指定顯示區(qū)域,width和height單位都是米 
mapView.region = MKCoordinateRegionMakeWithDistance(coordinate, width, height); 
    之后可以通過addSubview添加地圖。
 屬性:showsUserLocation-為YES,系統(tǒng)會持續(xù)跟蹤用戶的位置
          userLocationVisible-為YES,將顯示用戶所在位置

顯示地圖之后,常常希望在地圖上添加標(biāo)注,這需要創(chuàng)建一個類,并實(shí)現(xiàn)MKAnnotation協(xié)議,這個類叫做標(biāo)注對象。標(biāo)注對象往往實(shí)現(xiàn) setCoordinate:方法來設(shè)置其坐標(biāo)。在地圖視圖上,可以設(shè)置標(biāo)注對象的坐標(biāo),然后添加進(jìn)去,這樣地圖上就會出現(xiàn)一個標(biāo)注。代理方法title 和subtitle能夠在標(biāo)注上顯示標(biāo)題和副標(biāo)題。

// 初始化 
   mapView = [MKMapView alloc] initWithFrame: CGRectMake(100, 100, 550, 700)]; 
   mapView.showsUserLocation = TRUE; 
   mapView.mapType = MKMapTypeStandard; 
   mapView.delegate = self; 
   // 設(shè)置坐標(biāo) 
   CLLocationCoordinate2D coordinate; 
   coordinate.latitude = 37.31; 
   coordinate.longtitude = -122.03; 
   mapView.region = MKCoordinateRegionMakeWithDistance(coordinate, 4000, 6000); // 4000米寬,6000米高的區(qū)域 
   [self.view insertSubview: mapView atIndex: 0]; 

十六.通過storyboard來初始化一個controller

CBigDesignImageViewController *imageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"BigImageController"];  
   BigImageController是要在storyboard中設(shè)置的Identifier屬性。

十七.給UIView子類設(shè)置陰影,包括各種控件

1 導(dǎo)入QuartzCore framework
2 #import
3 編碼:

[imgView layer] setShadowOffset:CGSizeMake(5, 5)]; // 陰影的范圍  
[imgView layer] setShadowRadius:2]; // 陰影擴(kuò)散的范圍控制  
[imgView layer] setShadowOpacity:1]; // 陰影透明度  
// 陰影的顏色 
[imgView layer] setShadowColor:[UIColor brownColor].CGColor];

十八.設(shè)置UIScrollView滾動速度

// 自動滾動太快,效果不好,這里把動畫設(shè)置慢點(diǎn),注意下面要直接賦值contentOffset,不要用帶animated參數(shù)的函數(shù),否則動畫會出問題,因?yàn)閮商幎际莿赢嬓Ч?  
  [UIScrollView animateWithDuration:1.0f  
                               delay:0  
                               options:UIViewAnimationCurveLinear 
                               animations:^{ 
                                   scrollView.contentOffset = CGPointMake(0, 0);  
                               } 
                               completion:^(BOOL finished){} 
                               ];  
        // 如果在減速滾動過程中,按了刷新按鈕,執(zhí)行上面的動畫,會出現(xiàn)重置的位置,y不是0的情況,這里再調(diào)用一次,滾動到0。 
        [scrollView setContentOffset:CGPointMake(0, 0) animated:YES];  

十九.EXC_BAD_ACCESS

Here’s the advice I generally give to developers when you hit an EXC_BAD_ACCESS error:
-Set the NSZombieEnabled argument in your executable options, which sometimes helps narrow down the cause
-Run with Apple Instruments such as Leaks to look for memory issues
-Set a breakpoint in your code and step through until you narrow down where it’s crashing
Tried and true “comment out code till it works” then backtrack from there :]
設(shè)置 NSZombieEnabled 的方法:
你可以點(diǎn)擊 Xcode 菜單 Product -> Edit Scheme -> Arguments, 然后將點(diǎn)擊”加號”, 將 NSZombieEnabled 參數(shù)加到 Environment Variables 窗口中, 后面的數(shù)值寫上 ”YES”.
或者在 Xcode4 菜單 Product -> Edit Scheme -> Diagnostics 設(shè)置窗口中直接勾上 Enable Zombie Objects 即可,Xcode 可用 cmd+shift+< 進(jìn)到這個窗口。

二十 iOS 8 及 iOS 9

  1. 定位
    在IOS8中定位功能新增了兩個方法:
- (void)requestWhenInUseAuthorization __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_8_0);

- (void)requestAlwaysAuthorization __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_8_0);

這兩個新增的方法導(dǎo)致,之前寫的程序在iOS8運(yùn)行會出現(xiàn),定位功能無法正常使用
這樣讓iOS8正常使用定位功能呢?
<1>你需要在info.plist表里面添加兩條變量
在Info.plist中加入兩個缺省沒有的字段
NSLocationAlwaysUsageDescription//一直允許
NSLocationWhenInUseUsageDescription//使用時允許

屏幕快照 2015-10-16 下午5.38.52.png
  1. iOS 9 網(wǎng)絡(luò)請求
    iOS9把所有的http請求都改為https了:iOS9系統(tǒng)發(fā)送的網(wǎng)絡(luò)請求將統(tǒng)一使用TLS 1.2 SSL。采用TLS 1.2 協(xié)議,目的是 強(qiáng)制增強(qiáng)數(shù)據(jù)訪問安全,而且 系統(tǒng) Foundation 框架下的相關(guān)網(wǎng)絡(luò)請求,將不再默認(rèn)使用 Http 等不安全的網(wǎng)絡(luò)協(xié)議,而默認(rèn)采用 TLS 1.2。服務(wù)器因此需要更新,以解析相關(guān)數(shù)據(jù)。如不更新,可通過在 Info.plist 中聲明,倒退回不安全的網(wǎng)絡(luò)請求。
    1.在Info.plist中添加NSAppTransportSecurity類型Dictionary。
    2.在NSAppTransportSecurity下添加NSAllowsArbitraryLoads類型Boolean,值設(shè)為YES。
屏幕快照 2015-10-16 下午5.35.54.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內(nèi)容

  • 前面我們介紹了Core Animation框架中的圖層,接下來我們來學(xué)習(xí)動畫部分,動畫是Core Animatio...
    WellsCai閱讀 508評論 0 3
  • 今年由于個人原因,有了換工作的想法,所以把我整理的一些面試到的問題還有面試之前整理的問題都寫下來,就當(dāng)做一個備份。...
    IrisZL閱讀 306評論 0 0
  • 一. 渲染原理和GPU、CPU的作用 我們在前面學(xué)到了Core Animation的功能(繪圖和動畫),接下來要學(xué)...
    WellsCai閱讀 883評論 0 4
  • 一. 前言 很多人都用過AFNetWorking和SDWebImage,其實(shí)底層就是封裝了NSURLSession...
    WellsCai閱讀 8,515評論 5 24
  • 一. GCD和多線程的介紹 GCD GCD是異步執(zhí)行任務(wù)的技術(shù)之一。開發(fā)者只需要定義想執(zhí)行的任務(wù)并追加到適當(dāng)?shù)腄i...
    WellsCai閱讀 286評論 0 1