NSPointerArray的用处
摘要: NSPointerArray的用处 1. 说明 也许你对NSArray使用了如指掌,每个加入到NSArry的对象都会被NSArray持有.有时候,这种特性不是我们想要的结果. 有时候,我们想将对象存储起来,但是不想让数组增加了这个对象的引用计数,这个时候,NSPointArray才是你想要的.
下面是代码部分
//.h文件
#import <Foundation/Foundation.h>
@interface WeakMutableArray : NSObject
/**
* 获取所有有效的对象
*/
@property (nonatomic, strong, readonly) NSArray *allObjects;
/**
* 数组中有用对象的个数
*/
@property (nonatomic, readonly) NSInteger usableCount;
/**
* 数组中所有对象的个数(包括NULL)
*/
@property (nonatomic, readonly) NSInteger allCount;
/**
* 添加对象
*
* @param object 被添加对象
*/
- (void)addObject:(id)object;
/**
* 获取数组中的对象(可以获取到NULL对象)
*
* @param index 数组下标
*
* @return 对象
*/
- (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的用处
遇到一个问题,把 self 加到静态变量的 NSArray 的时候,由于被 NSArray 持有,所以无法释放,因此不能调用 dealloc 方法,也就无法将自己从 array 中 remove 掉。问题整理一下,就是如何在 NSArray 中存放 weak 的引用?
解决的方案是:在外面加上一层 NSValue。然后把包装好的对象加入数组
NSValue *value = [NSValue valueWithNonretainedObject:myObj];
[array addObject:value];
网友评论