#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 в качестве значений в словарь.