簡體   English   中英

鍵/值觀察不觸發屬性定義為:@property(readwrite,retain)__ attribute __((NSObject))CGImageRef thumbnailImage

[英]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

KVC文件:

自動換行和解包不限於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM