swifit聲明類
class person {
...
...
}
面向?qū)ο笕筇匦?/h3>
53-01.png
53-02.png
53-03.png
Swift中的循環(huán)引用
- 野指針和僵尸對(duì)象:http://blog.csdn.net/yi_zz32/article/details/48639005
- 靜態(tài)圖片
53-04.png
- 動(dòng)態(tài)圖片
53-01.gif
- 代碼如下
import Foundation
// 1.定義兩個(gè)類
class Person {
// 通常情況下對(duì)象類型會(huì)聲明稱可選類型
// 等號(hào)右邊為nil類型,那么等號(hào)左邊就不能為Book類型,必須為可選類型Book?,這樣才有機(jī)會(huì)讓book為nil類型啊
// 因?yàn)榈忍?hào)左右兩側(cè)類型一致才可以賦值,如果直接為Book類型,則會(huì)報(bào)類型不一致不能賦值的錯(cuò)誤
var b : Book? = nil //等價(jià) var book : Book?
deinit {
print("Person -- deinit") // print(__FUNCTION__)
}
}
class Book {
/************解決循環(huán)引用的做法(做法1,做法2)************/
/* weak和unowned相同點(diǎn):創(chuàng)建對(duì)象時(shí),對(duì)象的引用計(jì)數(shù)器都不會(huì)加1
weak修飾的對(duì)象類型,對(duì)象被銷毀時(shí)(用weak修飾,對(duì)象創(chuàng)建出來立刻被銷毀),該對(duì)象的引用計(jì)數(shù)器自動(dòng)指向nil
weak和unowned不同點(diǎn):<
unowned修飾的對(duì)象類型,對(duì)象被銷毀時(shí)(必須通過設(shè)置對(duì)象為nil來銷毀),該對(duì)象的引用計(jì)數(shù)器依然指向最初的內(nèi)存地址。所以容易造成壞的內(nèi)存訪問(野指針),訪問僵死對(duì)象 */
// 做法1:weak
//weak var owner : Person? = Person() 或者 weak var owner : Person?
// 做法2:unowned
// unowned修飾的對(duì)象,引用計(jì)數(shù)器不會(huì)加1哦
// 雖然owner是Book類中的一個(gè)屬性,但是owner : Person = Person(),owner就是一個(gè)對(duì)象了,
// 所以owner既是Book中的屬性,也是Person類中的對(duì)象
unowned var owner : Person = Person() // 有unowned修飾,owner此時(shí)相當(dāng)于弱指針,執(zhí)行完這行立馬被銷毀
deinit {
print("Book -- deinit")
}
}
// 2.創(chuàng)建類對(duì)應(yīng)的對(duì)象
var p : Person? = Person()// p指針強(qiáng)引用著Person()的地址,也就是強(qiáng)引用著Person類對(duì)象
var b : Book? = Book() // p指針強(qiáng)引用著Book()的地址,也就是強(qiáng)引用這Book類對(duì)象
// 3.設(shè)置對(duì)象之間的關(guān)系
p?.b = b // Person類中的b指向b對(duì)象,也就是Book類對(duì)象
b?.owner = p!// Book類中的owner指向b對(duì)象,也就是Person類對(duì)象
// 3中的兩行代碼造成了循環(huán)引用,即你強(qiáng)引用著我,我強(qiáng)引用著你,兩個(gè)對(duì)象最終都不會(huì)被釋放,即不會(huì)打印deinit的內(nèi)容。解決辦法(辦法1,辦法2)
// 辦法1:讓Person類中的b或者Book中的owner,其中一個(gè)變成弱引用,即用weak修飾
// 辦法2:讓Person類中的b或者Book中的owner,其中一個(gè)用unowned修飾
p = nil // 釋放p強(qiáng)引用著的Person類對(duì)象.注釋的話,不打印Person -- deinit
b = nil // 釋放b強(qiáng)引用著的Book類對(duì)象。注釋掉的話,不打印Book -- deinit
// var owner : Person = Person(),沒有unowned修飾時(shí),owner的指針強(qiáng)引用著Person的類對(duì)象,所以不會(huì)被釋放.執(zhí)行到第38行時(shí),owner的指針由之前指向的Person,轉(zhuǎn)而指向了另一個(gè)類(38行)中的Person.所以此時(shí)會(huì)打印之前的Person類對(duì)象被銷毀,。執(zhí)行到p = nil,b = nil時(shí),指針p被銷毀,指針b被銷毀,但是由于Person類對(duì)象和Book類對(duì)象存在循環(huán)引用,你強(qiáng)引用著我,我強(qiáng)引用著你,導(dǎo)致最后誰也沒執(zhí)行deinit,所以只會(huì)打印一次deinit
// 當(dāng) unowned var owner : Person = Person(),有unowned修飾時(shí),執(zhí)行到第28行,owner就會(huì)被銷毀,因?yàn)橛胾nowned修飾對(duì)象owner,引用計(jì)數(shù)器不會(huì)加1,所以為0,為0的話,對(duì)象一被創(chuàng)建出來就立馬被銷毀
可選鏈
53-05.png
可選鏈的使用
53-06.png
協(xié)議的使用
53-07.png
協(xié)議在代理中的使用
53-08.png
OC的block + Swift的閉包
- 閉包的類型: (參數(shù)列表) -> (返回值的類型)
53-09.png
尾隨閉包
- 閉包的類型: (參數(shù)列表) -> (返回值的類型)
53-10.png
解決閉包的循環(huán)引用
53-11.png
懶加載的使用
53-12.png
常見注釋
53-13.png
1.單行注釋 //
2.多行注釋 /* */
swift支持多行注釋之間的嵌套使用
3.文檔注釋 ///
4.分組注釋
// MARK:- 系統(tǒng)回調(diào)函數(shù)
// MARK: viewDidLoad方法
訪問權(quán)限
private : 修飾當(dāng)前的源文件(就是當(dāng)前類), 在當(dāng)前源文件中可以訪問,在其他文件中不可訪問。就是oc中的private
internal : 修飾整個(gè)項(xiàng)目. 在整個(gè)項(xiàng)目中都可以進(jìn)行訪問,并且默認(rèn)情況下修飾就是internal。就是在oc中整個(gè)項(xiàng)目中的所有類中,都可以進(jìn)行訪問
public : 是可以跨框架訪問
異常處理
Swift項(xiàng)目中使用OC的代碼
- 創(chuàng)建oc文件時(shí)候,選擇創(chuàng)建橋接文件,那么系統(tǒng)內(nèi)部就會(huì)自動(dòng)配置橋接文件。聚義步驟如下
53-14.png
53-15.png
- 創(chuàng)建oc文件時(shí)候,選擇不創(chuàng)建橋接文件,那么我們必須手動(dòng)配置橋接文件。具體步驟如下:
53-16.png
- 創(chuàng)建橋接文件
-
53-17.png
53-18.png
53-19.png
- 導(dǎo)入要使用的類
53-20.png
53-21.png
- 將橋接文件的路徑放到上圖的4宏
53-22.png
53-24.png
53-25.png
對(duì)以上的特別注意:
- 手動(dòng)創(chuàng)建橋接文件Header.h的時(shí)候,這個(gè)文件要放在黃色的ZB里面創(chuàng)建出來,如果在如下的地方創(chuàng)建了Header.h,你會(huì)發(fā)現(xiàn)Swift項(xiàng)目中無法使用OC的代碼,即使你其余的步驟操作都正確了
53-23.png
OC項(xiàng)目中使用Swift的代碼
- 在oc項(xiàng)目中Command+N一個(gè)Swift文件
53-26.png
53-27.png
- 一定都要用public修飾
53-28.png
- 導(dǎo)入頭文件格式固定
53-29.png
對(duì)以上的特別注意:
53-30.png

53-01.png

53-02.png

53-03.png

53-04.png

53-01.gif
import Foundation
// 1.定義兩個(gè)類
class Person {
// 通常情況下對(duì)象類型會(huì)聲明稱可選類型
// 等號(hào)右邊為nil類型,那么等號(hào)左邊就不能為Book類型,必須為可選類型Book?,這樣才有機(jī)會(huì)讓book為nil類型啊
// 因?yàn)榈忍?hào)左右兩側(cè)類型一致才可以賦值,如果直接為Book類型,則會(huì)報(bào)類型不一致不能賦值的錯(cuò)誤
var b : Book? = nil //等價(jià) var book : Book?
deinit {
print("Person -- deinit") // print(__FUNCTION__)
}
}
class Book {
/************解決循環(huán)引用的做法(做法1,做法2)************/
/* weak和unowned相同點(diǎn):創(chuàng)建對(duì)象時(shí),對(duì)象的引用計(jì)數(shù)器都不會(huì)加1
weak修飾的對(duì)象類型,對(duì)象被銷毀時(shí)(用weak修飾,對(duì)象創(chuàng)建出來立刻被銷毀),該對(duì)象的引用計(jì)數(shù)器自動(dòng)指向nil
weak和unowned不同點(diǎn):<
unowned修飾的對(duì)象類型,對(duì)象被銷毀時(shí)(必須通過設(shè)置對(duì)象為nil來銷毀),該對(duì)象的引用計(jì)數(shù)器依然指向最初的內(nèi)存地址。所以容易造成壞的內(nèi)存訪問(野指針),訪問僵死對(duì)象 */
// 做法1:weak
//weak var owner : Person? = Person() 或者 weak var owner : Person?
// 做法2:unowned
// unowned修飾的對(duì)象,引用計(jì)數(shù)器不會(huì)加1哦
// 雖然owner是Book類中的一個(gè)屬性,但是owner : Person = Person(),owner就是一個(gè)對(duì)象了,
// 所以owner既是Book中的屬性,也是Person類中的對(duì)象
unowned var owner : Person = Person() // 有unowned修飾,owner此時(shí)相當(dāng)于弱指針,執(zhí)行完這行立馬被銷毀
deinit {
print("Book -- deinit")
}
}
// 2.創(chuàng)建類對(duì)應(yīng)的對(duì)象
var p : Person? = Person()// p指針強(qiáng)引用著Person()的地址,也就是強(qiáng)引用著Person類對(duì)象
var b : Book? = Book() // p指針強(qiáng)引用著Book()的地址,也就是強(qiáng)引用這Book類對(duì)象
// 3.設(shè)置對(duì)象之間的關(guān)系
p?.b = b // Person類中的b指向b對(duì)象,也就是Book類對(duì)象
b?.owner = p!// Book類中的owner指向b對(duì)象,也就是Person類對(duì)象
// 3中的兩行代碼造成了循環(huán)引用,即你強(qiáng)引用著我,我強(qiáng)引用著你,兩個(gè)對(duì)象最終都不會(huì)被釋放,即不會(huì)打印deinit的內(nèi)容。解決辦法(辦法1,辦法2)
// 辦法1:讓Person類中的b或者Book中的owner,其中一個(gè)變成弱引用,即用weak修飾
// 辦法2:讓Person類中的b或者Book中的owner,其中一個(gè)用unowned修飾
p = nil // 釋放p強(qiáng)引用著的Person類對(duì)象.注釋的話,不打印Person -- deinit
b = nil // 釋放b強(qiáng)引用著的Book類對(duì)象。注釋掉的話,不打印Book -- deinit
// var owner : Person = Person(),沒有unowned修飾時(shí),owner的指針強(qiáng)引用著Person的類對(duì)象,所以不會(huì)被釋放.執(zhí)行到第38行時(shí),owner的指針由之前指向的Person,轉(zhuǎn)而指向了另一個(gè)類(38行)中的Person.所以此時(shí)會(huì)打印之前的Person類對(duì)象被銷毀,。執(zhí)行到p = nil,b = nil時(shí),指針p被銷毀,指針b被銷毀,但是由于Person類對(duì)象和Book類對(duì)象存在循環(huán)引用,你強(qiáng)引用著我,我強(qiáng)引用著你,導(dǎo)致最后誰也沒執(zhí)行deinit,所以只會(huì)打印一次deinit
// 當(dāng) unowned var owner : Person = Person(),有unowned修飾時(shí),執(zhí)行到第28行,owner就會(huì)被銷毀,因?yàn)橛胾nowned修飾對(duì)象owner,引用計(jì)數(shù)器不會(huì)加1,所以為0,為0的話,對(duì)象一被創(chuàng)建出來就立馬被銷毀

53-05.png

53-06.png

53-07.png

53-08.png

53-09.png

53-10.png

53-11.png

53-12.png

53-13.png
1.單行注釋 //
2.多行注釋 /* */
swift支持多行注釋之間的嵌套使用
3.文檔注釋 ///
4.分組注釋
// MARK:- 系統(tǒng)回調(diào)函數(shù)
// MARK: viewDidLoad方法
private : 修飾當(dāng)前的源文件(就是當(dāng)前類), 在當(dāng)前源文件中可以訪問,在其他文件中不可訪問。就是oc中的private
internal : 修飾整個(gè)項(xiàng)目. 在整個(gè)項(xiàng)目中都可以進(jìn)行訪問,并且默認(rèn)情況下修飾就是internal。就是在oc中整個(gè)項(xiàng)目中的所有類中,都可以進(jìn)行訪問
public : 是可以跨框架訪問

53-14.png

53-15.png

53-16.png

53-17.png

53-18.png

53-19.png

53-20.png

53-21.png

53-22.png

53-24.png

53-25.png

53-23.png

53-26.png

53-27.png

53-28.png

53-29.png

53-30.png