20150624_OC之协议与自定义类型的归档

本文深入讲解Objective-C中的协议概念,包括如何定义协议、遵守及实现协议,并通过具体示例介绍了必选方法与可选方法的区别。此外,还探讨了自定义类型如何遵循NSCoding协议以实现归档。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

协议例子1:

//
//  main.m
//  IOS150624_ObjectiveC_协议语句
//
//  Created by PengJunlong on 15/6/24.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Programmer.h"

//****************************
//*         协议              *
//****************************
//协议:约定双方相互遵守的规范
//计算机中:http://  ftp://  smb://  tcp

//OC中的协议:一组方法的列表
//1.定制协议(只做方法的声明,不去实现)
//在Foundation中所有的协议直接或者间接的遵守NSObject协议
//@protocol Coder <NSObject>
//
//- (void)writeCode;
//- (void)debugCode;
//- (void)report;
//
//@end

//遵守协议,协议名放在<>中,遵守多个协议,协议之间用逗号隔开
//@interface Programmer : NSObject <Coder,NSCopying>
//
//@end

//3.实现协议(实现协议中的方法),由遵守协议的类实现.协议中的方法默认是必须实现
//@implementation Programmer
//- (void)writeCode
//{
//    
//}
//- (void)debugCode
//{
//    
//}
//- (void)report
//{
//    
//}
//
//- (id)copyWithZone:(NSZone *)zone
//{
//    return self;
//}
//
//@end

//4.使用协议

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Programmer *xiaoZhang = [[Programmer alloc]init];
        xiaoZhang.name = @"小张";
        NSLog(@"%@",xiaoZhang.name);
        [xiaoZhang writeCode];
        [xiaoZhang debugCode];
        [xiaoZhang report];
    }
    
    return 0;
}
//——————————
//
//  Coder.h
//  IOS150624_ObjectiveC_协议语句
//
//  Created by PengJunlong on 15/6/24.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import <Foundation/Foundation.h>

//自定义一个协议,协议名和类名可以相同
@protocol Coder <NSObject>

- (void)writeCode;
- (void)debugCode;
- (void)report;

@end

@interface Coder : NSObject
@property (copy,nonatomic)NSString *name;
@end
//———————————————
//
//  Coder.m
//  IOS150624_ObjectiveC_协议语句
//
//  Created by PengJunlong on 15/6/24.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import "Coder.h"

@implementation Coder

@end
//———————————————
//
//  Programmer.h
//  IOS150624_ObjectiveC_协议语句
//
//  Created by PengJunlong on 15/6/24.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Coder.h"   //遵守协议必须包含协议所在的头文件

@interface Programmer : Coder <Coder>

@end
//—————————————————
//
//  Programmer.m
//  IOS150624_ObjectiveC_协议语句
//
//  Created by PengJunlong on 15/6/24.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import "Programmer.h"

@implementation Programmer
- (void)writeCode
{
    NSLog(@"轻轻松松敲键盘,快快乐乐写代码");
}
- (void)debugCode
{
    NSLog(@"辛辛苦苦调代码");
}
- (void)report
{
    NSLog(@"工作完成可以报告上线了");
}
@end


协议例子2:
//
//  main.m
//  IOS150624_ObjectiveC_协议关键字3
//
//  Created by PengJunlong on 15/6/24.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Student.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Student *std = [[Student alloc] init];
        [std wirteCode];
        [std debugCode];
        [std report];
    }
    return 0;
}
//———————————————
//
//  Programmer.h
//  IOS150624_ObjectiveC_协议关键字3
//
//  Created by PengJunlong on 15/6/24.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol Programmer <NSObject>
@required   //(缺省),默认,必须实现的方法,不实现会有警告,其他没有影响
- (void)wirteCode;
- (void)debugCode;
- (void)report;

@optional   //可选,在遵守该协议的类中可以选择实现或者不实现该方法,不会有警告.但是如果要调用这个方法则必须实现
- (void)eat;
- (void)drink;
@end
//———————————————
//
//  Student.h
//  IOS150624_ObjectiveC_协议关键字3
//
//  Created by PengJunlong on 15/6/24.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Programmer.h"
//遵守多个协议时,将多个协议写在<>中,使用","分割开
@interface Student : NSObject <Programmer>

@end
//——————————————
//
//  Student.m
//  IOS150624_ObjectiveC_协议关键字3
//
//  Created by PengJunlong on 15/6/24.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import "Student.h"

@implementation Student

- (void)wirteCode
{
    NSLog(@"写代码");
}

- (void)debugCode
{
    NSLog(@"调试代码");
}

- (void)report
{
    NSLog(@"写报告");
}
@end


协议例子3:自定义类型的归档
//
//  main.m
//  IOS150624_ObjectiveC_协议语句2
//
//  Created by PengJunlong on 15/6/24.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Dog.h"
//*******************
//*    使用系统协议   *
//*******************


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //将自定义类型归档,需要遵守NSCoding协议,实现其中的两个方法.(只归档成员变量,不归档类中的方法)
        Dog *xiaoBai = [[Dog alloc] init];
        xiaoBai.name = @"小白";
        xiaoBai.age = 12;
        BOOL ret = [NSKeyedArchiver archiveRootObject:xiaoBai toFile:@"/Users/qianfeng/Public/ExerciseProject/IOS150624_ObjectiveC_协议语句2/IOS150624_ObjectiveC_协议语句2/dog.txt"];
        if (ret) {
            NSLog(@"归档成功");
        }
        else
        {
            NSLog(@"归档失败");
        }
        
        //反归档
        Dog *dog = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/qianfeng/Public/ExerciseProject/IOS150624_ObjectiveC_协议语句2/IOS150624_ObjectiveC_协议语句2/dog.txt"];
        if (dog) {
            NSLog(@"dog = %@",dog);
        }
        else
        {
            NSLog(@"解码失败");
        }
    }
    return 0;
}
//—————————————
//
//  Dog.h
//  IOS150624_ObjectiveC_协议语句2
//
//  Created by PengJunlong on 15/6/24.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Dog : NSObject <NSCoding>
@property (copy,nonatomic)NSString *name;
@property (assign,nonatomic)NSInteger age;
@end
//———————————————
//
//  Dog.m
//  IOS150624_ObjectiveC_协议语句2
//
//  Created by PengJunlong on 15/6/24.
//  Copyright (c) 2015年 Peng Junlong. All rights reserved.
//

#import "Dog.h"

@implementation Dog
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    //如果父类也遵守对应的协议,那么应该先调用父类的方法进行编码,层层递归编码
    //[super encodeWithCoder:aCoder];
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInteger:self.age forKey:@"age"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
    //如果父类也遵守对应的协议,先调用父类的方法解码
    //self = [super initWithCoder:aDecoder];
    self.name = [aDecoder decodeObjectForKey:@"name"];
    self.age  = [aDecoder decodeIntegerForKey:@"age"];
    return self;
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"name = %@,age = %ld",_name,_age];
}
@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值