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:?@an0uu属性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