iOS-如何在數(shù)組中使用弱引用(weak reference)

NSPointerArray的用處

摘要: NSPointerArray的用處 1. 說(shuō)明 也許你對(duì)NSArray使用了如指掌,每個(gè)加入到NSArry的對(duì)象都會(huì)被NSArray持有.有時(shí)候,這種特性不是我們想要的結(jié)果. 有時(shí)候,我們想將對(duì)象存儲(chǔ)起來(lái),但是不想讓數(shù)組增加了這個(gè)對(duì)象的引用計(jì)數(shù),這個(gè)時(shí)候,NSPointArray才是你想要的.

下面是代碼部分

//.h文件
#import <Foundation/Foundation.h>

@interface WeakMutableArray : NSObject

/**
 *  獲取所有有效的對(duì)象
 */
@property (nonatomic, strong, readonly)  NSArray    *allObjects;

/**
 *  數(shù)組中有用對(duì)象的個(gè)數(shù)
 */
@property (nonatomic, readonly)          NSInteger   usableCount;

/**
 *  數(shù)組中所有對(duì)象的個(gè)數(shù)(包括NULL)
 */
@property (nonatomic, readonly)          NSInteger   allCount;

/**
 *  添加對(duì)象
 *
 *  @param object 被添加對(duì)象
 */
- (void)addObject:(id)object;

/**
 *  獲取數(shù)組中的對(duì)象(可以獲取到NULL對(duì)象)
 *
 *  @param index 數(shù)組下標(biāo)
 *
 *  @return 對(duì)象
 */
- (id)objectAtWeakMutableArrayIndex:(NSUInteger)index;

@end
//.m文件
#import "WeakMutableArray.h"

@interface WeakMutableArray ()

@property (nonatomic, strong) NSPointerArray  *pointerArray;

@end

@implementation WeakMutableArray

- (instancetype)init {
    
    self = [super init];
    if (self) {
        [self setup];
    }
    return self;
}

- (void)setup {
    self.pointerArray = [NSPointerArray weakObjectsPointerArray];
}

- (void)addObject:(id)object {
    [self.pointerArray addPointer:(__bridge void *)(object)];
}

- (id)objectAtWeakMutableArrayIndex:(NSUInteger)index {
    return [self.pointerArray pointerAtIndex:index];
}

#pragma mark - 重寫getter方法
@synthesize allObjects = _allObjects;
- (NSArray *)allObjects {
    return self.pointerArray.allObjects;
}

@synthesize usableCount = _usableCount;
- (NSInteger)usableCount {
    return self.pointerArray.allObjects.count;
}

@synthesize allCount = _allCount;
- (NSInteger)allCount {
    return self.pointerArray.count;
}

@end

NSValue的用處

遇到一個(gè)問(wèn)題,把 self 加到靜態(tài)變量的 NSArray 的時(shí)候,由于被 NSArray 持有,所以無(wú)法釋放,因此不能調(diào)用 dealloc 方法,也就無(wú)法將自己從 array 中 remove 掉。問(wèn)題整理一下,就是如何在 NSArray 中存放 weak 的引用?
解決的方案是:在外面加上一層 NSValue。然后把包裝好的對(duì)象加入數(shù)組

NSValue *value = [NSValue valueWithNonretainedObject:myObj];
[array addObject:value];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容