2016-06-29 12 views
1

なくてもシリアライズされる理由:クラスは、私は、次のクラス使用していますNSCodingプロトコル

インポート私はまだ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 

を。次のコードは動作します。私の質問はなぜですか?あなたはこれらのメソッドを実装している -

// 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:がYESを返す場合は、実験を行うことができます。あなたは宣言していません。

Objective-Cは強く型付けされた言語ではないので、自由にそのようなことを行うことができ、うまくいきます。 1つの例として、プロトコルを実装していますが、宣言しておらず、プロトコルが実装されていると宣言できますが、実際にはそれらのメソッドを実装していません。コンパイル時にコードがクラッシュします。強く型付けされたSwiftでは、あなたはそのような状況に陥ることができません。

関連する問題