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