зацикливание на NSMutableArray

#objective-c

#objective-c

Вопрос:

NSArray1.h

 #import <Foundation/Foundation.h>

typedef struct
{
    unsigned short          wAppTimerId;    
    BOOL                    bPersistent;   
    uint8_t                 uPeriod;        
    BOOL                    bStopped;       
    uint8_t                 uExpirationTime;    
} stRs232Timer;

@interface NSArray1 : NSObject {

    unsigned short wTimerId;
    NSLock* theLock;
    NSMutableDictionary*  m_cAppIdMap;
    NSMutableArray* m_cPendingEventList;

}

-(BOOL)createTimer;
-(BOOL)KillTimer:(unsigned short)wTimerId;

@end
  

NSArray1.m

 #import "NSArray1.h"

@implementation NSArray1

 -(BOOL)createTimer
{
    stRs232Timer*   pEvent = malloc(sizeof(stRs232Timer));

    pEvent->bPersistent = YES;                        
    pEvent->wAppTimerId = 95;
    pEvent->uPeriod     = 50;
    pEvent->bStopped    = NO;
    wTimerId = 95;

    NSLog(@"bPersistent:%d",pEvent->bPersistent);
    NSLog(@"wAppTimerId:%d",pEvent->wAppTimerId);
    NSLog(@"uPeriod:%d",pEvent->uPeriod);
    NSLog(@"bStopped:%d",pEvent->bStopped);

    theLock = [[NSLock alloc]init];

    [self KillTimer:wTimerId];
    if ([theLock tryLock]) {
        //CFDictionarySetValue(m_cAppIdMap,amp;wTimerId,pEvent);
        [m_cAppIdMap setObject:pEvent forKey:wTimerId];
        [theLock unlock];
    }   

    return YES;
}
-(BOOL)KillTimer:(unsigned short)wTimerId
{
    stRs232Timer* pEvent;
    BOOL bReturn=NO;
    theLock = [[NSLock alloc]init];

    if ([theLock tryLock]) {
             // remove from app map
        NSLog(@"Locked");
        [m_cAppIdMap setObject:pEvent forKey:wTimerId]; //warning:passing argument 1 of setObject from incompatible pointer type
        int no = [m_cAppIdMap count];
        NSLog(@"The no of entries in array is:%d",no);
        for(id i in m_cAppIdMap)
        {
            NSLog(@"Going to remove a key!!");
            [self findAndRemoveEvent:pEvent];
            [m_cAppIdMap removeObjectForKey:wTimerId]; //warning:Local declaration of wTimerId hides instance object
            NSLog(@"Removed the key");  //warning:passing argument 1 of 'objectForKey' makes pointer from integer without a cast
            free(pEvent);
            bReturn = YES;
        }
        NSLog(@"Unlocked!!");
        [theLock unlock];
    }   

    return bReturn;
}

@end
  

вывод:

 2011-05-24 14:12:55.289 NSArray[3313:a0f] bPersistent:1
2011-05-24 14:12:55.291 NSArray[3313:a0f] wAppTimerId:95
2011-05-24 14:12:55.292 NSArray[3313:a0f] uPeriod:50
2011-05-24 14:12:55.292 NSArray[3313:a0f] bStopped:0
2011-05-24 14:12:55.293 NSArray[3313:a0f] Locked
2011-05-24 14:12:55.293 NSArray[3313:a0f] The no of entries in array is:0
2011-05-24 14:12:55.294 NSArray[3313:a0f] Unlocked!!
  

Это not going into the for loop .Мне нужно найти событие для определенного ключа (95).Кроме того, хотя я задаю словарю значение, а ключ — это not giving мне correct count значение.Оно показывает значение счетчика как ‘0’.

Комментарии:

1. NSDictionary и NSMutableDictionary не может содержать «вещи», отличные от объектов Objective-C, вот почему вы получаете предупреждение при отправке -setObject:forKey: . Ключи тоже должны быть объектами.

2. Вы можете поместить свои объекты structs внутрь NSData , сохранив последние в словаре. Для ключей вы можете поместить объекты unsigned shorts внутри NSNumber в ячейку.

3. Однако, возможно, вам будет проще использовать класс Objective-C вместо struct . Это упростит их хранение в коллекциях Foundation, таких как NSArray и NSDictionary .

4. @Bavarious: Спасибо.. все предупреждения исчезли. Я установил NSData * myarr = [NSData dataWithBytesamp;pEvent length:sizeof(pEvent)]; как вы сказали мне сделать. Но теперь я не смог получить правильный вывод. Это не входит в цикл for метода KillTimer!!!

Ответ №1:

Ключ словаря должен быть объектом.

Попробуйте заменить строку setObject на это:

 [m_cAppIdMap setObject:pEvent forKey:[NSNumber numberWithUnsignedShort:wTimerId]];
  

Комментарии:

1. объект, соответствующий NSCopying протоколу.

2. Спасибо. Предупреждение было удалено, но у меня есть еще одно ослабление «передача аргумента1 setObject: forKey из несовместимого типа указателя». Я передаю указатель на структуру в качестве значения в словарь.

3. pEvent не является объектом Objective-C.

4. @Bavarious: Как мне установить объект структуры в объект objective C.

5. Я думаю, что это должно наследоваться от NSObject.

Ответ №2:

Прежде всего, не называйте свои классы, используя NS префикс, поскольку это зарезервировано только для Apple.

Во-вторых, вы уверены, что хотите хранить вещи в структуре вместо пользовательского класса или словаря? Структура, конечно, более легкая, но может вызвать небольшие трудности при интеграции в объектно-ориентированную программу.

Комментарии:

1. да, я вставляю объекты struct в качестве значений в словарь.