即使没有NSCoding协议,为什么类被序列化

时间:2016-06-29 14:19:35

标签: ios objective-c

我正在使用以下课程:

import

@interface Person : NSObject
{

}

@property (nonatomic,copy) NSString *firstName;
@property (nonatomic,copy) NSString *lastName; 

@end

@implementation Person

- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super init];

    self.firstName = [coder decodeObjectForKey:@"firstName"];
    self.lastName = [coder decodeObjectForKey:@"lastName"];

    return self;

}

- (void)encodeWithCoder:(NSCoder *)coder
{
    [coder encodeObject:self.firstName forKey:@"firstName"];
    [coder encodeObject:self.lastName forKey:@"lastName"];
}

@end

我仍然可以在不符合NSCoding协议的情况下序列化这个类。以下代码有效。我的问题是为什么?

 // create a person
    Person *person = [[Person alloc] init];
    person.firstName = @"John";
    person.lastName = @"Doe";

    NSData *personData = [NSKeyedArchiver archivedDataWithRootObject:person];

1 个答案:

答案 0 :(得分:2)

NSCoding的声明是

@protocol NSCoding

- (void)encodeWithCoder:(NSCoder *)aCoder;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder; // NS_DESIGNATED_INITIALIZER

@end

这意味着你的类符合它 - 你已经实现了这些方法。你唯一没做的就是声明你实现了协议,这可能会导致一些警告(或编译错误,只是为了防止你崩溃),但通常你很好。此外,如果+conformsToProtocol:返回YES,即使您尚未声明,也可以进行实验。

修改Objective-C不是强类型语言,因此您可以自由地执行此类操作,并且可以正常使用。一个例子就是你所做的:实现协议,但没有声明 - 它可以工作,或者你可以声明你正在实现协议,但实际上没有实现那些方法 - 然后除了你将得到的警告在编译期间,您的代码将崩溃。在Swift,这是一个强类型,你不能进入这样的情况。