#objective-c
#objective-c
Вопрос:
Я не смог получить значение для ключа.
У меня есть структура pt (которая является значением) и wTiId, wTiId1 (который является ключом).
Я уверен, что в приведенном ниже коде я делаю что-то не так, но я не мог понять, что это.
Timers.h
---------
#import <Foundation/Foundation.h>
struct session {
int a;
char c;
}pstruct;
@interface Timers : NSObject {
unsigned short wTiId;
unsigned short wTiId1;
}
-(void)timer;
@end
Timers.m
--------
#import "Timers.h"
@implementation Timers
-(id)init
{
if (self=[super init]) {
wTiId=71;
wTiId1=72;
}
return self;
}
-(void)dealloc
{
[super dealloc];
}
-(void)timer
{
struct session* pt = amp;pstruct;
pt->a=12;
pt->c='L';
CFDictionaryValueCallBacks cbvs = {0,NULL,NULL,NULL,NULL};
CFMutableDictionaryRef cfmdict = CFDictionaryCreateMutable(NULL,0,amp;kCFTypeDictionaryKeyCallBacks,amp;cbvs);
NSLog(@"Dict size:%dn",((CFIndex)CFDictionaryGetCount(cfmdict)));
CFNumberRef tiId = CFNumberCreate(NULL,kCFNumberShortType,amp;wTiId);
CFNumberRef tiId1 = CFNumberCreate(NULL,kCFNumberShortType,amp;wTiId1);
CFDictionarySetValue(cfmdict,tiId,pt);
NSLog(@"Dict size:%dn",((CFIndex)CFDictionaryGetCount(cfmdict)));
CFDictionarySetValue(cfmdict,tiId1,pt);
NSLog(@"Dict size:%dn",((CFIndex)CFDictionaryGetCount(cfmdict)));
NSLog(@"The value is:%s",(CFDictionaryGetValue(cfmdict,tiId)));
CFRelease(tiId);
CFRelease(tiId1);
}
@end
main.m
------
#import <Foundation/Foundation.h>
#import "Timers.h"
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Timers* time = [[Timers alloc]init];
[time timer];
[pool drain];
return 0;
}
output
------
2011-05-15 14:52:54.857 timer[3511:a0f] Dict size:0
2011-05-15 14:52:54.861 timer[3511:a0f] Dict size:1
2011-05-15 14:52:54.861 timer[3511:a0f] Dict size:2
2011-05-15 14:52:54.862 timer[3511:a0f] The value is:
Я также пробовал использовать спецификатор формата «% @».Ничего не печатается, когда CFDictionaryGetValue
вызывается функция ().Тип возвращаемого значения этой функции — const void* .
Ответ №1:
Результатом CFDictionaryGetValue
является то, что вы помещаете в словарь.
Вы должны привести результат CFDictionaryGetValue
к правильному типу указателя, чтобы получить доступ к элементам структуры:
struct session *value = (struct session *) CFDictionaryGetValue(cfmdict,tiId);
NSLog(@"The value is %d and %c", value->a, value->c);
Ответ №2:
Вы не можете хранить структуры в CFDictionarys, будут работать только указатели на структуры. Вы не можете распечатать содержимое структуры с помощью %s
спецификатора формата.
Комментарии:
1. Я объявил pt как указатель на struct .извините, я не упомянул об этом раньше. Раньше мы печатали содержимое структуры как pt-> a и pt-> c в «C». Значение, хранящееся здесь в словаре, является указателем на struct . Как получить значения, хранящиеся в нем.