swift自動引用計數

2021-07-09 13:54:01 字數 3526 閱讀 7391

/**

在少數情況下,arc為了能幫助你管理記憶體,需要更多的關於你的**之間關係的資訊

引用計數僅僅應用於類的例項,結構體和列舉型別是值型別,不是引用型別,也不是通過引用的方式儲存和傳遞

為了使之成為可能,無論你將例項賦值給屬性,常量或者是變數,屬性,常量或者變數,都會對此例項建立強引用。之所以稱之為強引用,是因為它會將例項牢牢的保持住,只要強引用還在,例項是不允許被銷毀的

*/class person

deinit

}var person1: person?;

var person2: person?

var person3: person?

person1 = person(name: "jack");

person2= person1;

person3= person1;

//arc會在第三個,也即最後乙個強引用被斷開的時候,銷毀person例項,這也意味著不再使用這個person例項

person1=

nil;

person2=

nil;

person3=

nil;

//類例項之間的迴圈強引用

/**乙個類永遠不會有0個強引用,這種情況發生在兩個類例項互相保持對方的強引用,並讓對方不被銷毀,這就是所謂的迴圈強引用

可以通過定義類之間的關係為弱引用或者無主引用,以此替代強引用,從而解決迴圈強引用的問題。

*/class people

var apartment: apartment?;

deinit

}class apartment

var tenant: people?;

deinit

}var john: people?;

var number73: apartment?

john = people(name: "john");

number73 = apartment(number: 73);

john!.apartment= number73;

number73!.tenant= john;

//無任何析構函式被呼叫,造成記憶體洩露

john = nil;

number73=

nil;

//解決例項之間的迴圈強引用

/**swift提供了兩種辦法來解決在使用類的屬性時所遇到的迴圈強引用問題:弱引用和無主引用

弱引用和無主引用允許迴圈應用中的乙個例項引用另乙個例項而不保持強引用,這樣例項能夠互相引用而不產生迴圈引用

對於生命週期中會變為nil的例項使用弱引用,相反,對於初始化賦值後再也不會被賦值為nil的例項,使用無主引用

*///弱引用

/**在宣告屬性或者變數時,在前面加上weak關鍵字表明這是乙個弱引用.

弱引用必須被宣告為變數,表明其值能在執行時被修改。弱引用不能被宣告為常量

*/class people2

var apartment: apartment2?;

deinit

}class apartment2

weak

var tenant: people2?;

deinit

}var john2: people2?;

var number732: apartment2?

john2 = people2(name: "john2");

number732 = apartment2(number: 73);

john2!.apartment= number732;

number732!.tenant= john2;

john2=

nil;

number732=

nil;

//無主引用

/**和弱引用類似,無主引用不會牢牢保持住引用的例項。和弱引用不同的是,無主引用是永遠有值的。因此,無主引用總是被定義為非可選型別。可以在宣告屬性或者變數時,在前面加上關鍵字unowned表示這是乙個無主引用

如果試圖在例項被銷毀後,訪問該例項的無主引用,會觸發執行時錯誤,使用無主引用,你必須確保引用始終指向乙個未銷毀的例項

還需要注意的是如果你試圖訪問例項已經被銷毀的無主引用,程式會直接崩潰,而不會發生無法預期的行為

*/class customer

deinit

}class creditcard

deinit

}var nick: customer?;

nick = customer(name: "nick");

nick!.card = creditcard(number: 1234567890, customer: nick!);

nick = nil;

//無主引用以及顯式展開的可選屬性

/***/

class country

deinit

}class city

deinit

}var country = country(name: "canada", capitalname: "ottawa");

print("

\(country.name)'s capital city is called

\(country.capitalcity.name)");

//閉包引起的迴圈強引用

/**類似block迴圈強引用

swift提供了一種優雅的方法來解決這個問題,稱之為閉包占用列表

ashtml宣告為lazy屬性,因為只有當元素確實需要處理為hy=tml輸出的字串時,才需要使用ashtml,也就是說,在預設的閉包中可以使用self,因為只有當初始化完成以及self確實存在後,才能訪問lazy屬性

*/class htmlelement else

}init(name: string, text: string? = nil)

deinit

}var paragraph: htmlelement? = htmlelement(name: "p", text: "hello, world");

//paragraph變數定義為可選htmlelement,因此我們可以賦值nil給它來演示迴圈強引用

print

(paragraph!.ashtml());

paragraph=

nil;

//解決閉包引起的迴圈強引用

/**在定義閉包時同時定義占有列表作為閉包的一部分,通過這種方式可以解決閉包和類例項之間的迴圈強引用。占有列表定義了閉包體內占有乙個或者多個引用型別的規則。跟解決兩個類例項間的迴圈強引用一樣,宣告每個占有的引用為弱引用或無主引用,而不是強引用,應當根據**關係來決定使用弱引用還是無主引用

占有列表放置在閉包引數列表和返回型別之前:

lazy var someclosure: (int, string) -> string =

如果閉包沒有指定引數列表或者返回型別,則可以通過上下文推斷,那麼可以占有列表放在閉包開始的地方,跟著是關鍵字in:

lazy var someclosure: () -> string =

*/

Swift 自動引用計數(ARC)

swift使用自動引用技術 arc 這一機制來跟蹤和管理應用程式的記憶體。通常情況下我們不需要去手動釋放記憶體,因為arc會在類的例項不再被使用時,自動釋放其占有的記憶體。但在有些時候我們還是需要在 中實現記憶體管理。class person deinit 值會被自動初始化為nil,目前還不會引用到...

Swift學習之自動引用計數

class person deinit var reference1 person?var reference2 person?var reference3 person?reference1 person name iyaqi 此時會列印 person iyaqi is being initial...

swift基礎之自動引用計數

自動引用計數 分為 自動引用計數概念 引用計數策略 如何解決迴圈引用 閉包的迴圈引用 使用的到的關鍵字 weak 弱引用不會影響引用計數,一般時 optional unowned 無主引用不會影響引用計數,一般時 非optional 概念 在swift中 自動引用計數是例項的被引用次數儲存起來,當被...