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];