我正在使用以下课程:
@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];
答案 0 :(得分:2)
NSCoding
的声明是
@protocol NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder; // NS_DESIGNATED_INITIALIZER
@end
这意味着你的类符合它 - 你已经实现了这些方法。你唯一没做的就是声明你实现了协议,这可能会导致一些警告(或编译错误,只是为了防止你崩溃),但通常你很好。此外,如果+conformsToProtocol:
返回YES,即使您尚未声明,也可以进行实验。
修改:Objective-C
不是强类型语言,因此您可以自由地执行此类操作,并且可以正常使用。一个例子就是你所做的:实现协议,但没有声明 - 它可以工作,或者你可以声明你正在实现协议,但实际上没有实现那些方法 - 然后除了你将得到的警告在编译期间,您的代码将崩溃。在Swift
,这是一个强类型,你不能进入这样的情况。