iOS 中集合如何弱引用物件

2021-09-11 13:00:44 字數 2597 閱讀 5029

1. 使用 nsvalue

nsvalue可以弱引用儲存乙個物件,我們可以使用這種方法間接的引用。

nsvalue *value = [nsvalue valuewithnonretainedobject:@selector(class)];

[array addobject:value];

複製**

2. 使用 nspointerarray,nsmaptable,nshashtable

以上三個型別的用法分別對應nsmutablearraynsmutabledictionarynsmutableset

nspointerarray

nspointerarraynsmutablearray一樣同是有序可變集合,可插入、刪除成員; 不同的是可以儲存null,且count可變,用null來填充。

// 例項化方法

- (instancetype)initwithoptions:(nspointerfunctionsoptions)options;

- (instancetype)initwithpointerfunctions:(nspointerfunctions *)functions;

複製**

nspointerfunctionsoptions列舉定義著記憶體管理策略、方法特性和記憶體標識,以下是幾個常用的列舉值:

記憶體管理策略:

方法特性:

記憶體標識:

選用多種組合方式:

nspointerfunctionsoptions options = nspointerfunctionsstrongmemory | nspointerfunctionsobjectpersonality | nspointerfunctionscopyin;

nshashtable *table = [nshashtable hashtablewithoptions:options];

複製**

static

bool isequal(const

void *item1, const

void *item2, nsuinteger (*size)(const

void *item))

nspointerfunctions *functions = [[nspointerfunctions alloc] init];

[functions setisequalfunction:isequal];

複製**

nsmaptable

nsmaptablenspointerarray的初始化方法和使用都類似,不同的是nsmaptable的 key 和 object 各有不同的策略,所以有四種組合:

keyobject

weak

weak

strong

weak

weak

strong

strong

strong

如果 key 或者 object 是weak修飾時,任意一方在記憶體中被釋放都會移除該鍵值對。

nshashtable

nshashtable使用方法類似於nsmutableset,只不過該型別的allobjectes屬性返回的是乙個nsarray,會對成員強引用。

3. 根據 nsvalue 的思路自己寫乙個類

新建乙個weakref類:

@inte***ce

weakref : nsobject

@property (nonatomic, weak) id ref;

@end

複製**

使用:

weakref *weakref = [weakref new];

weakref.ref = ***;

[array addobject:weakref];

複製**

4. 根據 nsvalue 的思路自己寫乙個 block

宣告和定義乙個 block:

typedef

id(^weakrefblock)();

typedef

id(^makeweakrefblock)(id);

makeweakrefblock makeweakref (id object) ;

return block;

}複製**

使用:

[array addobject:makeweakref([nsobject new])];

複製**

我的部落格:iosgg.cn/

當弱引用物件成為集合元素時

當我們在系統用到某些占用記憶體較多的大物件,且該物件並不會被頻繁使 用 例如快取場景 時,考慮效能因素,或許我們可以選擇使用弱引用 weakreference 物件。弱引用物件就像是物件之中的 無間行者 行走於 活動 與 非活動 狀態之間。可能在某個時刻雖然對該物件存在引用,然而垃圾 器仍然可以對其...

iOS 強引用( strong)和弱引用(

我們在建立乙個新的物件時經常會這樣做 id obj1 nsobject alloc init 其實系統已經預設我們聲名的這個物件就是強引用型別的id strong obj1 nsobject alloc init 強引用會使物件的引用係數 1 這裡又牽扯到記憶體管理的一些相關問題,有不明白的可以先搜...

iOS 弱引用weak的使用

oc開發過程中,我們經常會使用到弱引用和強引用 我們為什麼要使用弱引用呢?要想知道這個我們需要weak的原理。原理 runtime維護了乙個weak表,其實weak是乙個hash 雜湊 表,其中key表示指向物件的指標,value是乙個陣列,裡面儲存的weak指標的位址陣列,當我們使用 weak的時...