單例模式下使用代理,野指針的判斷

1.聲明成員變量

@interface SpeechRecognizerManager()<SFSpeechRecognitionTaskDelegate>
{
    //要通知的對象集合
    id  ayDelegate[100];
}
/** 要通知調(diào)度的對象個數(shù) */
@property (nonatomic, assign) NSUInteger nDelCount;
@end

2.添加調(diào)度對象

- (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.移出調(diào)度對象

- (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.判斷調(diào)度對象是否已經(jīng)存在

/**
 代理數(shù)組是否包含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;
}
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • __block和__weak修飾符的區(qū)別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,584評論 0 6
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,655評論 1 51
  • 這世間所有的所有,都是一場相遇 在那些世態(tài)炎涼中,去歷練一個人對生活的選擇和判斷,在那些是非困惑中去讓浮云散去,活...
    海月禪林閱讀 499評論 1 5
  • 寫作的時候,會遇到瓶頸期,不知怎么寫怎么辦呢? 遇到這個時候我采用的方法有這幾方面。 第一、停一下不寫不在糾結(jié),放...
    91dc4539346d閱讀 720評論 0 0
  • 現(xiàn)在,每個星期我都會堅持去跑一次步。時間久了,這好像成為了我生活中一種習慣。 剛開始跑步的時候,我都會先打退堂...
    TUJ閱讀 739評論 4 10

友情鏈接更多精彩內(nèi)容