マイアプリはiOS5を(UIColor>>#copyWithZone
が存在しない)とiOS6 +の両方で動作する必要があります(UIColor>>#copyWithZone
が存在している)ので、私は、次のを思い付いた:
@implementation UIColor(ios5CopyWithZone)
+ (void)initialize
{
// iOS5 dosn't include UIColor>>#copyWithZone so add it with class_addMethod.
// For iOS6+ class_addMethod fails as UIColor>>#copyWithZone already exists.
Class klass = [UIColor class];
Method methodToInstall = class_getInstanceMethod(klass, @selector(ios5CopyWithZone:));
class_addMethod(klass, @selector(copyWithZone:), method_getImplementation(methodToInstall), method_getTypeEncoding(methodToInstall));
}
// UIImage is immutable so can just return self.
// #retain to ensure we follow mem-management conventions
-(id)ios5CopyWithZone:(NSZone *)__unused zone
{
return [self retain];
}
@end
ランタイムのclass_addMethod
を使用してUIColor>>#copyWithZone
を追加するコードの試みを。私はこれがUIColor>>#copyWithZone
をカテゴリに直接実装するよりも優れているかどうかはわかりませんが、AppleのAvoid Category Method Name Clashesを読むことは、既存のフレームワークメソッド(iOS6ではUIColor>>#copyWithZone
)を再実装することが悪いことを意味します。しかし、私は+initialize
がフレームワークの+initialize
に潜んでいる可能性があることに気付きました。
おそらく、これは役に立ちます:http://robnapier.net/blog/implementing-nscopying-439 – CodaFi
頭がおかしくなりました。あなたのブログエントリはこの特定の質問に答えませんが、コピープロトコルを実装しているクラスのディープコピーオーバーライドを書くことに決めたなら、はるかに深刻な疑問を抱くでしょう。優れた説明。 – Wienke
あなたの質問は素晴らしいです。 +1 – CodaFi