概述階段
iOS崩潰的常見原因
1.系統(tǒng)庫向上兼容問題稚虎,某些方法明確被廢棄舞箍,在新版本系統(tǒng)中無法運行
2.系統(tǒng)庫向下兼容問題,某些庫只能在高版本系統(tǒng)中使用则酝,老系統(tǒng)并不支持
3.本地數(shù)據(jù)儲存結(jié)構(gòu)變化悔据,但未兼容過去的數(shù)據(jù)(用戶已安裝老版本APP)庄敛,初始化時無法正確讀取數(shù)據(jù)
4.訪問的數(shù)據(jù)類型不是期望的數(shù)據(jù)類型而產(chǎn)生崩潰,常見的問題:NULL科汗、Number類型藻烤。解決方案:最優(yōu)勢服務(wù)器端加入默認值,其次可以在客戶端接收數(shù)據(jù)后立即進行整體處理,全轉(zhuǎn)為String
5.數(shù)組越界
6.野指針
7.內(nèi)存處理不當隐绵,內(nèi)存泄露之众。常見于:照片模塊、地圖模塊依许、block回調(diào)
- NSTimer未銷毀棺禾,timer只要加入了runloop,那么它就會對于self進行持有,直到[timer invalidate]峭跳,所以如果使用timer膘婶,一定要記得釋放
Swift知識點:
1.swift中的Array和[]是一個東西,編譯器會自動識別
2.Swift中可以使用OC對象蛀醉,OC對象所能使用的方法依然是OC中的方法
3.OC對象是否可變是根據(jù)自身類型來的悬襟,比如:let聲明的NSMutableArray對象,依然可以增刪改
4.OC中的可變對象往往不能直接轉(zhuǎn)成Swift對象拯刁,比如:NSMutableArray無法直接轉(zhuǎn)為Array
5.Dictionary字典類型依然是由index這個相關(guān)屬性的脊岳,但是字典本身是無序的,所以這個index的用法并不是很明朗
代碼階段
Array、NSArray垛玻、 NSMutableArray的創(chuàng)建和轉(zhuǎn)換
/**** 方式1割捅、2、3帚桩、4均是Swift數(shù)據(jù)類型 方式5亿驾、6是OC數(shù)據(jù)類型 ****/
//數(shù)組建立方式1:默認建立
let list1 = ["你好","2","3","4"]
//數(shù)組建立方式2:指定類型String
var list2:[String] = ["你好","2","3","4"]
//數(shù)組建立方式3:指定類型Any
let list3:[Any] = ["你好","2","3",3,UILabel()]
//數(shù)組建立方式4:指明Array類型
let list4:Array<Any> = ["你好","2","3","4",UILabel()]
//數(shù)組建立方式5:指明NSArray類型
let list5:NSArray = ["你好","2","3","4",UILabel()]
//數(shù)組建立方式6:指明NSMutableArray類型
let list6:NSMutableArray = ["1","2","3","4"]
/**** 想把 NSArray 轉(zhuǎn)為 Array ****/
//NSArray轉(zhuǎn)換寫法1:依靠自動推到,這樣寫系統(tǒng)推斷出的類型為Array<AnyObject>
let list7:Array = list5 as Array
print(list7)
//NSArray轉(zhuǎn)換寫法2:指定數(shù)組內(nèi)容的類型账嚎,轉(zhuǎn)換后即為Array<Any>
let list8 = list5 as! Array<Any>
print(list8)
//NSMutableArray轉(zhuǎn)換寫法1:這樣寫雖然可以莫瞬,但編譯器會報警告
let list9 = list6 as! [Any]
print(list9)
//NSMutableArray轉(zhuǎn)換寫法2:遍歷存儲
var list10:Array<String> = Array()
for item in list6 {
list10.append(item as! String)
}
print(list10)
//Array中添加刪除修改,只有其用var修飾符才可以操作
var list11 = list8
//Swift對象只能用append
list11.append("11")
list11.removeAll()
//而OC對象不受修飾符影響郭蕉,NAArray不可增刪改疼邀,NSMutableArray依然用OC中的方法增刪改
let list12 = list6
//OC對象只能用add
list12.add("12")
list12.removeAllObjects()
Array的增刪改以及遍歷
var list1 = ["1", "2", "3", "4", "5"]
//在某一位置添加,原位置元素向后移
list1.insert("0", at: 0)
//在末尾添加
list1.append("6")
//["0", "1", "2", "3", "4", "5", "6"]
print(list1)
//修改某個位置的元素
list1[0] = "zero"
//修改某一段,替換進去的Array長度并無要求召锈,
list1[0..<3] = ["zero", "one"]
//["zero", "one", "3", "4", "5", "6"]
print(list1)
//刪除某一位置元素
list1.remove(at: 0)
//
print(list1)
//常規(guī)遍歷
for item in list1[0..<3] {
print(item)
}
//元組遍歷
for (index, value) in list1.enumerated() {
print("Item \(index): \(value)")
}
Array的map()函數(shù)和flatMap()函數(shù)
//Swift中旁振,數(shù)組的每一個元素都需要執(zhí)行一項操作,除了用for循環(huán)烟勋,還可以用map函數(shù)
//map()是 Array 提供的方法规求,通過接收一個函數(shù)作為傳入?yún)?shù)筐付,對數(shù)組中每個元素進行函數(shù)變換得到新的結(jié)果值卵惦。
//這樣只需要提供X->Y的映射關(guān)系,就能將數(shù)組[X]變換到新數(shù)組[Y]瓦戚,而無需創(chuàng)建一個臨時可變數(shù)組
let lsits = ["張三", "張三的爸爸", "李四", "李四的爸爸"]
let closure = {(str:String) -> String in
var result = str
if str.contains("張三") {
result = "尊敬的" + str
}
return result
}
//["尊敬的張三", "尊敬的張三的爸爸", "李四", "李四的爸爸"]
print(lsits.map(closure))
//如果內(nèi)部操作足夠簡單沮尿,還有這種寫法
print(lsits.map {$0 + ",你好" })
//map函數(shù)中可以嵌套map函數(shù)
let numbers2 = [[1,2,3],[4,5,6]];
let result2 = numbers2.map{ $0.map{ $0 + 2 } }
// [[3, 4, 5], [6, 7, 8]]
print(result2)
//除了map還有flatMap()方法,
//如果map()是X->Y,那么flatMap()就是X->Y?,且flatMap()會剔除nil的數(shù)據(jù)
//簡單的說:flatMap()除了給每個數(shù)據(jù)綁定一個固定的操作外畜疾,還可以剔除不符合要求的數(shù)據(jù)
let numbers3 = [1,2,3,4];
let result3 = numbers3.flatMap { (v) -> String? in
if v <= 2 {
return nil
}
return String(v)
}
//["3", "4"]赴邻,注意這里還會的是一個[String]數(shù)組了
print(result3)
Array的Sort()函數(shù)
let numbers = [12,25,1,35,27]
//常規(guī)寫法
let numbersSorted = numbers.sorted{ (n1, n2) -> Bool in
//index越大,值越小啡捶,倒序
return n2 < n1
}
print(numbersSorted)
//極簡寫法(index越大姥敛,值越大,正序)
let numbersSorted2 = numbers.sorted {$1 > $0}
print(numbersSorted2)
//終極蛇皮寫法(正序)
numbers.sorted(by: <)
Dictionary的創(chuàng)建和刪除
//Swift中只要滿足Hashable協(xié)議瞎暑,都可以做字典的key
var intDict = [Int: String]()
//float或double類型也可以
var doubleDict = [1.1:"1",2.1:"2"]
//甚至Data彤敛、Date類型均是可以的
var dateDict = [Date(): "當前時間"]
//此時,不指定類型了赌,默認dict的推斷類型為[String:String?]
var testDict:[String:String?] = ["key1": "value1", "key2": nil]
//在初始化時,value中可以存在nil值墨榄,但是后續(xù)添加元素的時候不允許再添加nil值
testDict["key3"] = nil
//["key2": nil, "key1": Optional("value1")]
print(testDict)
//updateValue()更新值方法,同時它會有一個返回值勿她,返回該key舊的值
//如果該key在原字典中不存在袄秩,那么返回值就會為nil
if let oldValue = testDict.updateValue("value4", forKey: "key4") {
print("The old value for DUB was \(oldValue).")
}
print(testDict)
//只要這個key在原字典中存在,返回值就有效
if let oldValue = testDict.updateValue("value2", forKey: "key2") {
//會被打印
print("The old value for is \(oldValue).")
}
//["key2": Optional("value2"), "key4": Optional("value4"), "key1": Optional("value1")]
print(testDict)
//刪除方式1
testDict.removeAll()
//true
print(testDict.isEmpty)
//刪除方式2
testDict = [:]
//true
print(testDict.isEmpty)
Dictionary的遍歷
var dict = [1:"23",3:"3",5:"23",7:"3"]
//元組遍歷方式
for (key, value) in dict {
print("\(key): \(value)")
}
for key in dict.keys {
print("打印key值: \(key)")
}
for value in dict.values {
print("打印Value值: \(value)")
}
//dict.keys不是常見的Array數(shù)組逢并,需要進行轉(zhuǎn)換才可成為正常的Array
//更準確的說dict.keys是LazyMapCollection類型,這是種可以強轉(zhuǎn)為Array的類型
let keys = [Int](dict.keys);
print(keys);
Dictionary的index
/*
雖然dict是無序的之剧,但實際上dict依然可以使用dict.index()和dict.enumerated()
甚至還可以根據(jù)index去remove,這一點很奇怪
這里的index依然可以作為索引找到對應(yīng)元素,但實際上是無序的
沒事不要去用了筒狠,會出問題的
*/
//唯一正常的和index相關(guān)的用法
//先找到key對應(yīng)的index值
let index = dict.index(forKey: 1)
//然后刪除它
dict.remove(at: index!)
//打印
for num in dict.enumerated() {
print("打印信息:index:",num.offset,"value:",num.element)
}