当我们在将某个对象加到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];
}
}
}
}
519



被折叠的 条评论
为什么被折叠?



