gpt4 book ai didi

objective-c - 检查 id isKindOfType CFType

转载 作者:搜寻专家 更新时间:2023-10-30 19:58:24 26 4
gpt4 key购买 nike

简而言之:如何在运行时确定id 是否为CFType

我正在实现 dynamic core data attributes在 ExtendedManagedObject 的 willSave 方法中,我想检查 id 值是否为 CFType 以将其存储到 plist 文件中。

如果我试图保存到 plist UIImage,它不是与 CF 桥接的免费电话 (apple docs),我会收到一个错误:

2011-11-17 17:16:25.294 [490:707] 保存扩展数据时出错:属性列表对格式无效(属性列表不能包含“CFType”类型的对象)

我可以用某种方法检查它还是我必须自己实现(只是来自文档的 isKindOfClass)?

我不想在 NSManagedObject 子类中实现访问器,我不知道我将从实体属性中获得多少 url。问题是关于运行时的动态扩展属性。

- (void)willSave
{
NSDictionary *changes = [self valueForKey:@"extendedChanges"];
if (changes!=nil) {
// merge changes into snapshot
NSMutableDictionary *dict = [[self extendedSnapshot] mutableCopy];
NSEnumerator *e = [changes keyEnumerator];
NSString *key;
while (key=[e nextObject]) {
id value = [changes objectForKey:key];



if (value==[NSNull null])
[dict removeObjectForKey:key];
else if (#ugly and I'm not shure is thread safe **else if ([value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSDictionary class]] || [value isKindOfClass:[NSDate class]] || [value isKindOfClass:[NSData class]] || [value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]])**)
[dict setObject:value forKey:key];
}

// archive as binary plist
NSData *data = nil;
if ([dict count]>0) {
NSString *error=nil;
data = [NSPropertyListSerialization dataFromPropertyList:dict
format:NSPropertyListBinaryFormat_v1_0 errorDescription:&error];
if (error!=nil) {
NSLog(@"Error saving extended data: %@", error);
[error release];
}
}
[dict release];
[self setPrimitiveValue:data forKey:@"extendedData"];
}
[super willSave];
}

最佳答案

这是处理问题的错误方法。您引用的博客文章将扩展属性保存为序列化 plist。 plist 只能包含以下类型的对象,如 official doc 中所写:

NSArray, NSDictionary, NSDate, NSData, NSString and NSNumber.

其他类是不允许的。不要将任何其他类的对象添加到以这种方式扩展的属性中。

此外,将图像文件保存在 CoreData 数据库中不是一个好主意,一般来说,请阅读 On Blobs在官方文档中。相反,将 UIImage 保存在一个文件中,并将文件路径写入 CoreData 数据库。


如果你只是有一个临时属性没有保存到数据库,你甚至不必经历创建扩展属性的麻烦。只需将其添加为 NSManagedObject 的子类的属性即可:

@interface MyManagedObject: NSManagedObject {
}
@property(retain, nonatomic) UIImage* thumbnail;
@property(retain, nonatomic) NSDictionary* thumbnailDictionary;
@end

没有在 CoreData 模型中添加 thumbnail。然后在.m文件中做相应的@synthesize。以这种方式添加到托管对象的属性不会被保存。

如果您想保留未知数量的缩略图,您可以放置​​一个包含 UIImage*NSDictionary(或 NSArray)。


如果您真的想从 NSObject* 中获取 CFType,请执行以下操作:

NSObject* x= ...;
CFTypeID typeID=CFGetTypeID((CFTypeRef)x);
if(typeID != CFStringGetTypeID() &&
typeID != CFDateGetTypeID() &&
typeID != CFDataGetTypeID() &&
typeID != CFDictionaryGetTypeID() &&
typeID != CFArrayGetTypeID() ) {
... it's a non-plistable type ...
}

存在丑陋的 if 子句是因为没有公共(public)函数可以为您提供未桥接的 Objective-C 对象的 CFTypeID。阅读CFType引用。但我不建议这样做。

关于objective-c - 检查 id isKindOfType CFType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8168012/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com