![](/img/trans.png)
[英]strong @property with __attribute__((NSObject)) for a CF type doesn't retain
[英]Key/value observing not firing for property defined as: @property (readwrite, retain) __attribute__((NSObject)) CGImageRef thumbnailImage
我有一個具有屬性定義的類,如下所示:
// 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.
__attribute__((NSObject))
告訴編譯器將結構指針視為對象,因此這允許您保留/釋放對象(通常用於塊)。 此屬性對CFImageRef
是結構指針的事實沒有影響,並且KVC不會自動換行結構指針,盡管它會包裝結構。 要解決您的問題,您需要在未定義的鍵上截取KVC以設置和返回正確的對象,或者只使用UIImage
。
自動換行和解包不限於NSPoint,NSRange,NSRect和NSSize結構類型(即,Objective-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
TestCF_KVC.m
#import "TestCF_KVC.h"
@implementation TestCF_KVC
@synthesize text, aStruct, cftext;
-(void)setValue:(id)value forUndefinedKey:(NSString *)key
{
NSLog(@"undefined key set for %@", key);
if([key isEqualToString:@"cftext"])
{
self.cftext = (CFStringRef)value;
}
else
{
[super setValue:value forUndefinedKey:key];
}
}
-(id)valueForUndefinedKey:(NSString *)key
{
NSLog(@"undefined key get for %@", key);
if([key isEqualToString:@"cftext"])
{
return (NSString*)self.cftext;
}
return [super valueForUndefinedKey:key];
}
-(void)test
{
NSString *txt = @"text worked";
AStruct astr = { .x=1, .y=5, .z=10 };
CFStringRef cftxt = (CFStringRef)@"cftext worked";
//Test a normal NSString for KVC
[self setValue:txt forKey:@"text"];
txt = [self valueForKey:@"text"];
NSLog(@"text[%s]: %@", @encode(NSString), [self valueForKey:@"text"]);
//Test a struct for KVC
NSValue *value = [NSValue value:&astr withObjCType:@encode(AStruct)];
[self setValue:value forKey:@"aStruct"];
[[self valueForKey:@"aStruct"] getValue:&astr];
NSLog(@"aStruct[%s]: %d %d %d", @encode(AStruct), aStruct.x, aStruct.y, aStruct.z);
//Test a Core Foundation type for KVC
[self setValue:(NSString*)cftxt forKey:@"cftext"];
cftxt = (CFStringRef)[self valueForKey:@"cftext"];
NSLog(@"cftext[%s]: %@", @encode(CFStringRef), (NSString*)cftxt);
}
@end
來自呼叫測試的日志輸出:
text[{NSString=#}]: text worked
aStruct[{?=iii}]: 1 5 10
undefined key set for cftext
undefined key get for cftext
cftext[^{__CFString=}]: cftext worked
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.