2016-06-29 5 views
1

Я использую следующий класс:Почему Класс Сериализированные Даже без NSCoding протокола

импорт

@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]; 

ответ

2

Декларация NSCoding является

@protocol NSCoding 

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

@end 

означает, что вы класс соответствует его - вы реализовали эти методы. Единственное, что вы не сделали, это объявить, что вы внедрили протокол, который может привести к некоторым предупреждениям (или компиляции ошибок, только чтобы предотвратить вас от сбоев), но, как правило, вам хорошо идти. Кроме того, вы можете сделать эксперимент, если +conformsToProtocol: возвращает ДА, даже если вы его не объявили.

Редактировать: Objective-C не является строго типизированным языком, поэтому у вас есть свобода делать что-то подобное, и оно будет работать. Одним из примеров является то, что вы сделали: реализовали протокол, но не объявили это - и он работает, или вы можете заявить, что используете этот протокол, но на самом деле не реализуете эти методы - тогда кроме предупреждения, которое вы получите во время компиляции ваш код выйдет из строя. В Swift, который строго типизирован, вы не можете попасть в такую ​​ситуацию.