为什么UIView(或它的子类)不采用NSCopying协议?

时间:2009-10-11 23:48:16

标签: iphone cocoa-touch uikit nscopying

Cocoahead可以解释为什么UIView及其子类不采用NSCopying协议吗?

从哲学上讲,我可以看到为什么UITouch不符合副本,因为它是一个非常时间的对象。通过UIView,它的子类,尤其是UIButton,看起来像应该能够被复制。

当然,Apple有充分的理由以他们的方式做事。你知道他们的原因吗?

3 个答案:

答案 0 :(得分:4)

他们问的问题似乎不是“为什么不呢?”但“为什么这样?”这样做没什么意义。很少需要复制实时视图。通常,模板视图是通过NSCoding协议(即使用Interface Builder)创建的,而且关于所有可复制视图都是有用的。

答案 1 :(得分:4)

有趣的问题。除了Chuck的答案,我想补充一点,原因可能是因为Apple做出了那个设计决定......就这么简单;没有真正的具体原因,但这是做出的决定。

我还可以假设这个决定可能是因为UIView被用作其他几个类的子类而工程师不想强行NSCopying强加于子类。

答案 2 :(得分: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