Objective c 对于定义为:@property(readwrite,retain)\uuuuu attribute\uuuuu((NSObject))CGImageRef thumbnailImage的属性,键/值未触发

Objective c 对于定义为:@property(readwrite,retain)\uuuuu attribute\uuuuu((NSObject))CGImageRef thumbnailImage的属性,键/值未触发,objective-c,key-value-observing,Objective C,Key Value Observing,我有一个属性定义如下的类: // Interface @property (retain) __attribute__((NSObject)) CGImageRef thumbnailImage; // Implementation @synthesize thumbnailImage; 问题在于self.thumbnailImage=newCGImageRef不会导致它触发键/值观察事件,并且从不调用observeValueForKeyPath:… 我用同一个类的另一个属性(BOOL)测试

我有一个属性定义如下的类:

// Interface
@property (retain) __attribute__((NSObject)) CGImageRef thumbnailImage;

// Implementation
@synthesize thumbnailImage;
问题在于
self.thumbnailImage=newCGImageRef不会导致它触发键/值观察事件,并且从不调用
observeValueForKeyPath:…

我用同一个类的另一个属性(BOOL)测试了代码,它对该属性非常有效。这不也适用于上述物业吗

注意:我尝试手动设置属性(
[self-setValue:newValue-forKey:@“thumbnailImage”]
,这导致以下错误:

setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key thumbnailImage.
告诉编译器将结构指针视为对象,因此这允许您保留/释放对象(通常用于块)。此属性对以下事实没有影响:
CFImageRef
是一个结构指针,KVC不会自动包装结构指针,尽管它会包装结构。若要解决此问题,您需要截取未定义键上的KVC以设置并返回正确的对象,或者只需使用
UIImage

自动包装和展开不限于NSPoint、NSRange、, NSRect和NSSize结构类型(即目标为-C的类型 以{)开头的类型编码字符串可以包装在NSValue中 反对

TestCF_KVC.h

#import <Foundation/Foundation.h>

typedef struct
{
    int x, y, z;
} AStruct;

@interface TestCF_KVC : NSObject {}

@property (nonatomic, retain) NSString *text;
@property (nonatomic, assign) AStruct aStruct;
@property (nonatomic, retain) __attribute__((NSObject)) CFStringRef cftext;

-(void)test;

@end
调用的日志输出-测试:

text[{NSString=#}]: text worked
aStruct[{?=iii}]: 1 5 10
undefined key set for cftext
undefined key get for cftext
cftext[^{__CFString=}]: cftext worked

为什么要使用uuu属性uuu((NSObject))?您是否自行@synthesis或实现访问器?您是否自动重写notifiesobsersforkey:?@an0
uu属性uuu((NSObject))需要将基础类型当作对象来处理,这样就可以保留它。用它就可以得到编译器错误。@乔,但是CGIMAVEREF是一个核心基础对象吗?我认为它不是CFType,CfRyLyc/cFrand不是它的适当内存管理功能。CGIMAGEVEF有它自己的CGIMAGETELIN /CGIMAGELSELLASE.@0 CGImageRef是核心图形,但它仍然是一个结构指针,可以被视为
NSObject
它不能直接转换为
UIImage
,因为它不是免费桥接的。该属性可以工作,并且仍然会保留它并正确释放它。@Joe CFRelease/CFRetain不是CGImageRetain/CGImageR的替代品elease.我认为我们不应该对CGImageRetain/CGImageRelease的实现做任何假设。我们应该将它们视为黑匣子。感谢您的出色解释。还有一个问题:合成setter会保留CFImageRef实例吗?我认为会,但在您说它会将其视为一个结构之后,我不确定。呵呵编译器是否知道如何保留结构?@Joe,演示得很好。你知道关于非NSObject对象(如CF和CG对象)的KVO的任何官方文档吗?@an0我正在寻找一些,希望有人能发布它。我发现的只是说明KVC支持以
开头的任何结构类型的文档{
@encode
ed@Joe,我也只发现了。但是当文档说“struct”时,它的意思是“struct”,这显然不适用于“struct pointer”。似乎我们需要一些苹果的帮助。
text[{NSString=#}]: text worked
aStruct[{?=iii}]: 1 5 10
undefined key set for cftext
undefined key get for cftext
cftext[^{__CFString=}]: cftext worked