当我们在将某个对象加到NSMutableArray(NSMutableDictionary),addobject 时会自动对象的引用计数加1,这时当我们想在对象释放自己调用dealloc方法时,同时将对象从NSMutableArray中移除时,就有问题了。因为我们加到NSMutableArray中时,对象的引用计数被加1,就是说如果不先从NSMutableArray remove的话,那对象引用计数永远都不会为0(按正确的释放),不会调用dealloc 方法,那这个解决的方法时,在添加进NSMutableArray对象时不要为对象引用计数加1,就可以了;
具体的做法是,用所要添加的对象,用另外的对象包装一下,再添加到NSMutableArray中
#import <Foundation/Foundation.h>
/**
* @brief 用于封装侦听对象,防止加入容器时引用计数被加1,无法释放
*/
@interface FEDownloadListenerItem : NSObject
@property (nonatomic, readonly, assign) id listener;
- (id)initWithListener:(id)listener;
@end
#import "FEDownloadListenerItem.h"
@implementation FEDownloadListenerItem
@synthesize listener = _listener;
- (id)initWithListener:(id)listener
{
if (self = [super init]) {
_listener = listener;
}
return self;
}
@end
//
//上面用来是用封装对象的类,里面只是将传入的对象保持引用,但没有retain //下面是使用,的方法
/** * @brief 根据附件ID 监听某个任务 * * @param attachmentId 附件ID */ - (void)listenTask:(NSObject*)listener attachmentId:(NSString*)attachmentId { if (task == nil) { return; } NSMutableArray *listens; if (listens == nil) { listens = [[[NSMutableArray alloc] init] autorelease]; } for (FEDownloadListenerItem* listenerItem in listens) { if (listenerItem.listener == listener) { return; } } FEDownloadListenerItem* listenerItem = [[FEDownloadListenerItem alloc] initWithListener:listener]; [listens addObject:listenerItem]; [listenerItem release]; } /** * @brief 根据附件ID 去除监听某个任务 * * @param listener 监听都 * @param attachmentId 附件ID */ - (void)removeListenTask:(NSObject*)listener attachmentId:(NSString*)attachmentId { NSMutableArray *listens ; if (listens != nil && listener != nil) { for (FEDownloadListenerItem* listenerItem in listens) { if (listenerItem.listener == listener) { [listens removeObject:listenerItem]; } } } }