나에게 답변. 사전의 valueForKey:
는 기본 동작을 덮어 사전은 키가없는 경우 애플 문서가 말한대로, 그것은 수행 전무를 반환하고 NSObject
으로 접근 메소드를 호출하지 않습니다
키로 시작하지 않는 경우 "@", objectForKey :를 호출합니다. key가 이 "@"로 시작하면 "@"을 제거하고 [super valueForKey :]를 키와 함께 호출합니다.
NSDictionary
은 클러스터 클래스이므로 하위 클래스를 사용하여 동작을 덮어 쓰지 않는 것이 좋습니다. 있는 NSArray가 valueForKey:@"toMyObject"
를 호출하는
@implementation NSDictionary (MyAddition)
static void swizzle(Class c, SEL orig, SEL new)
{
Method origMethod = class_getInstanceMethod(c, orig);
Method newMethod = class_getInstanceMethod(c, new);
if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
else
method_exchangeImplementations(origMethod, newMethod);
}
+ (void)initialize
{
if (self == [NSDictionary class]){
swizzle([NSDictionary class],
@selector(valueForKey:),
@selector(myValueForKey:));
}
}
- (id)toMyObject
{
return toMyObject;
}
...
- (id)myValueForKey:(NSString *)key
{
// for collection operators
if ([key compare:@"@" options:0 range:NSMakeRange(0, 1)] == NSOrderedSame)
return [super valueForKey:key];
if ([key isEqualToString:@"toMyObject"])
return [self toMyObject];
return [self myValueForKey:key];
}
가 지금은 안전 대신이 같은 스위스 방법을 사용합니다.
출처
2012-02-05 04:07:43
cxa
안녕 디트리히,'NSArray'의'valueForKey :'각 항목에 대해 호출됩니다 및 항목의'valueForKey의 결과를 포함하는 새 배열을 반환합니다' . Xcode를 열고 다음을 시도 할 수 있습니다 : NSArray array = [NSArray arrayWithObjects : @ "foo", @ "bar", @ "baz", nil]; NSArray * 대문자 = [배열 valueForKey : @ "capitalizedString"]; ' – cxa
및 여기에 문서 : https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray .html # // apple_ref/doc/uid/20000137-BBCIBCDJ – vikingosegundo
흠, 재단 변경 사항에 신경 쓰지 않은 것 같습니다. –