Cocoahead可以解释为什么UIView及其子类不采用NSCopying协议吗?
从哲学上讲,我可以看到为什么UITouch不符合副本,因为它是一个非常时间的对象。通过UIView,它的子类,尤其是UIButton,看起来像应该能够被复制。
当然,Apple有充分的理由以他们的方式做事。你知道他们的原因吗?
答案 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