1. 使用 nsvalue
nsvalue
可以弱引用儲存乙個物件,我們可以使用這種方法間接的引用。
nsvalue *value = [nsvalue valuewithnonretainedobject:@selector(class)];
[array addobject:value];
複製**
2. 使用 nspointerarray,nsmaptable,nshashtable
以上三個型別的用法分別對應nsmutablearray
,nsmutabledictionary
,nsmutableset
。
nspointerarray
nspointerarray
和nsmutablearray
一樣同是有序可變集合,可插入、刪除成員; 不同的是可以儲存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
nsmaptable
和nspointerarray
的初始化方法和使用都類似,不同的是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的時...