美文网首页
单例模式下使用代理,野指针的判断

单例模式下使用代理,野指针的判断

作者: 彼诸 | 来源:发表于2017-10-24 16:33 被阅读14次

    1.声明成员变量

    @interface SpeechRecognizerManager()<SFSpeechRecognitionTaskDelegate>
    {
        //要通知的对象集合
        id  ayDelegate[100];
    }
    /** 要通知调度的对象个数 */
    @property (nonatomic, assign) NSUInteger nDelCount;
    @end
    

    2.添加调度对象

    - (void)addObject:(id<ZTSpeechRecognizerDelegate>)obj {
        int i = [self delegateContainObj:obj];
        if (i < 0) {
            _nDelCount ++;
            ayDelegate[_nDelCount - 1] = obj;
            NSLog(@"speechRecognizerManager add obj success:%@",obj);
    

    3.移出调度对象

    - (void)removeObject:(id<ZTSpeechRecognizerDelegate>)obj {
        int i = [self delegateContainObj:obj];
        if (i >= 0) {
            [self delegateRemoveIndex:i];
            NSLog(@"speechRecognizerManager remove obj success:%@",obj);
        }
    }
    
    /**
     删除指定index的代理
    
     @param index 1
     */
    - (void)delegateRemoveIndex:(NSUInteger)index {
        //容错处理
        if (index >= _nDelCount) return;
        //自index开始前移
        for (NSInteger i = index; i < _nDelCount; i ++) {
            if (i == _nDelCount) ayDelegate[i] = 0;
            else ayDelegate[i] = ayDelegate[i+1];
        }
        _nDelCount--;
    }
    

    4.判断调度对象是否已经存在

    /**
     代理数组是否包含obj
    
     @param obj 1
     @return 若包含,返回所在index;不包含,返回-1
     */
    - (int)delegateContainObj:(id<ZTSpeechRecognizerDelegate>)obj{
        BOOL bFind = NO;
        int index = -1;
        NSMutableArray *ayWildPoin =[[NSMutableArray alloc] init];
        for (int i = 0; i < _nDelCount; i ++) {
            id delegate = ayDelegate[i];
            //指针是否是有效指针
            if (malloc_zone_from_ptr((void *)delegate))
            {
                bFind = [delegate isEqual:obj];
                
            }
            else
            {
                //野指针
                [ayWildPoin addObject:@(i)];
            }
            if (bFind){
                index = i;
                break;
            }
        }
        //移出野指针
        for (int i = 0;i < ayWildPoin.count;i ++) {
            [self delegateRemoveIndex:[ayWildPoin[i] integerValue]];
        }
        index = index - (int)ayWildPoin.count;
        [ayWildPoin release];
        NSLog(@"delegate array contain:%zi",index);
        return index;
    }
        }
    }
    

    相关文章

      网友评论

          本文标题:单例模式下使用代理,野指针的判断

          本文链接:https://www.haomeiwen.com/subject/ftkxpxtx.html