4

Cocoaheadは、UIViewとそのサブクラスがNSCopyingプロトコルを採用しない理由を説明できますか?

哲学的には、UITouchは非常に一時的なオブジェクトであるため、コピーに準拠しない理由がわかります。UIViewによると、そのサブクラス、特にUIButtonは、コピーできるはずのようです。

確かに、Appleには彼らのやり方で物事を行う正当な理由があります。あなたは彼らの理由を知っていますか?

4

3 に答える 3

4

彼らが尋ねた質問は「どうして?」ではなかったようです。しかし、「なぜそれをするのですか?」そうすることにはほとんど意味がありません。ライブビューをコピーする必要はめったにありません。通常、テンプレートビューはNSCodingプロトコルを介して(つまり、Interface Builderを使用して)作成されます。これで、コピー可能なビューが適しています。

于 2009-10-11T23:57:01.537 に答える
4

興味深い質問です。Chuckの答えに加えて、その理由はおそらくAppleがその設計上の決定を下したためだと付け加えたかった。本当の具体的な理由はありませんが、それが決定されました。

UIViewまた、他のいくつかのクラスのサブクラスとして使用されており、エンジニアがサブクラスに強制的に課したくないため、この決定が下された可能性があると推測できNSCopyingます。

于 2009-10-12T19:27:17.110 に答える
3

NSCopyingオブジェクトグラフの深い(再帰的な)コピーではそれほど優れていないからです。たとえば[NSArray copy]、オブジェクト自体ではなく、オブジェクトのリストをコピーします。オブジェクトグラフは、によってより適切に提供されNSCodingます。幸いなことに、これはによってサポートされていUIViewます。

プロパティを使用してカスタムビューをコピーする場合は、をサポートする必要がありますNSCoding。例えば、

@interface SKCustomCell : UITableViewCell

@property (strong, nonatomic) IBOutlet UILabel* nameLabel;
@property (strong, nonatomic) IBOutlet UIView* topView;

@end


static NSString* propertiesKey = @"SKCustomCellProperties";

@implementation SKCustomCell

@synthesize nameLabel;
@synthesize topView;

- (id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder: aDecoder];
    [self setValuesForKeysWithDictionary: [aDecoder decodeObjectForKey: propertiesKey]];
    return self;
}

- (void) encodeWithCoder:(NSCoder *)aCoder
{
    [super encodeWithCoder: aCoder];

    [aCoder encodeObject: [self dictionaryWithValuesForKeys: [[NSArray alloc] initWithObjects: @"nameLabel", @"topView", nil] forKey: propertiesKey];
}


@end
于 2012-05-15T13:10:56.403 に答える