我的iOS开发之Objective-C第8天之延展和协议以及深浅复制
2015-08-11 21:35
633 查看
延展
1、类的延展的概念
延展类别又称为扩展(Extendsion)
Extension是Category的一个特例
其名字为匿名(为空),并且新添加的方法一定要予以实现。(Category没有这个限制)
2、延展的实现
- 通过延展来实现方法的私有,延展的头文件独立。这种方法不能实现真正的方法私有,当在别的 文件中引入延展的头文件,那么在这个文件中定义的类的对象就可以直接调用在延展中定义所谓 私有的方法
举个例子吧
Student.h
Student.m
main.m
协议
1、协议的含义
OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了。
协议就是定义了一组方法,然后让其他类去实现
2、协议的定义格式:
@protocol 协议名 <父协议>
定义方法
@end
注:定义协议的关键字是@protocol,同时协议也是可以继承父协议的
协议中定义的方法还有两个修饰符:
@required:这个表示这个方法是其他类必须实现的,也是默认的值
@optional:这个表示这个方法对于其他类实现是可选的
这个就和类似与Java中的抽象类了,如果是abstract修饰的就必须实现,所以如果一个协议中没有@optional修饰的方法,那么这个协议就相当于Java中的接口了。
3、协议的使用
使用协议很简单,直接在继承类(如NSObject)后面 <协议名>
之后在对应类的实现文件中实现协议的所有必须类即可。
4、检查对象是否遵循协议,对应类是否实现协议中的方法:
分享一下今天的作业
已知同为Person类子类的Student和Teacher两个类,编写协议WorkingPartner要求这两个类遵循之并实现work方法
在主函数中实现将多个学生与老师对象放在同一个数组中,逐个取出数组的各个元素,并将其转换为WorkingPartner类型,再执行其work方法
Person.h
Person.m
Student.h
Student.m
Teacher.h
Teacher.m
WorkingPartner.h
main.m
copy
1、首先,什么是深浅复制?
在复制操作时,对于对象有n层是对象复制,我们可称作n级深复制,此处n应大于等于1。
浅 复 制:在复制操作时,对于被复制的对象的每一层复制都是指针复制。
深 复 制:在复制操作时,对于被复制的对象至少有一层复制是对象复制。
完全复制:在复制操作时,对于被复制的对象的每一层复制都是对象复制。指针复制俗称指针拷贝,对象复制也俗称内容拷贝。
2、不同关键字之间的区别
retain:始终是浅复制。引用计数每次加一。返回对象是否可变与被复制的对象保持一致
copy:对于可变对象为深复制,引用计数不改变;对于不可变对象是浅复制,引用计数每次加一,始终返回一个不可变对象
mutableCopy:始终是深复制,引用计数不改变。始终返回一个可变对象
3、[个人觉得这里对深浅复制讲的还可以(http://www.cnblogs.com/langtianya/p/3722129.html)
做的有点草率,近期会做相应的修改
1、类的延展的概念
延展类别又称为扩展(Extendsion)
Extension是Category的一个特例
其名字为匿名(为空),并且新添加的方法一定要予以实现。(Category没有这个限制)
@interface Student () @end
2、延展的实现
- 通过延展来实现方法的私有,延展的头文件独立。这种方法不能实现真正的方法私有,当在别的 文件中引入延展的头文件,那么在这个文件中定义的类的对象就可以直接调用在延展中定义所谓 私有的方法
举个例子吧
Student.h
#import <Foundation/Foundation.h> @interface Student : NSObject /** * 名字 */ @property(nonatomic ,strong) NSString *name; /** * 年龄 */ @property(nonatomic ,assign) int age; /** * 初始化实例方法并且调用打招呼方法 * * @param name 名字 * @param age 年龄 */ -(void) initWithName :(NSString *) name Age:(int) age; @end
Student.m
import "Student.h" /** * 延展 */ @interface Student () /** * 延展实现的不公开打招呼的方法 */ -(void) sayHi; @end @implementation Student -(void)sayHi{ NSLog(@"Myname is %@ and age is %d",self.name,self.age); } -(void)initWithName:(NSString *)name Age:(int)age{ self.name=name; self.age=age; [self sayHi]; } @end
main.m
#import <Foundation/Foundation.h> #import "Student.h" int main(int argc, const char * argv[]) { @autoreleasepool { Student *st=[Student new]; [st initWithName:@"lvdonghui" Age:22]; } return 0; }
协议
1、协议的含义
OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了。
协议就是定义了一组方法,然后让其他类去实现
2、协议的定义格式:
@protocol 协议名 <父协议>
定义方法
@end
注:定义协议的关键字是@protocol,同时协议也是可以继承父协议的
协议中定义的方法还有两个修饰符:
@required:这个表示这个方法是其他类必须实现的,也是默认的值
@optional:这个表示这个方法对于其他类实现是可选的
这个就和类似与Java中的抽象类了,如果是abstract修饰的就必须实现,所以如果一个协议中没有@optional修饰的方法,那么这个协议就相当于Java中的接口了。
3、协议的使用
使用协议很简单,直接在继承类(如NSObject)后面 <协议名>
之后在对应类的实现文件中实现协议的所有必须类即可。
4、检查对象是否遵循协议,对应类是否实现协议中的方法:
[对象 conformsToProtocol:@protocol(协议)]; [对象 respondsToSelector:@selector(方法)];
分享一下今天的作业
已知同为Person类子类的Student和Teacher两个类,编写协议WorkingPartner要求这两个类遵循之并实现work方法
在主函数中实现将多个学生与老师对象放在同一个数组中,逐个取出数组的各个元素,并将其转换为WorkingPartner类型,再执行其work方法
Person.h
#import <Foundation/Foundation.h> #import "WorkingPartner.h" /** * 人类,继承WorkingPartner协议 */ @interface Person : NSObject< WorkingPartner> /** * 名字 */ @property(nonatomic,strong) NSString *name; @end
Person.m
#import "Person.h" @implementation Person //直接在.m文件中实现即可,不需要在.h文件中再次定义 #pragma mark - WithProtocol -(void)work{ } @end
Student.h
#import "Person.h" @interface Student : Person @end
Student.m
#import "Student.h" @implementation Student -(void)work{ NSLog(@"我 %@要好好学习工作",self.name); } @end
Teacher.h
#import "Person.h" @interface Teacher : Person @end
Teacher.m
#import "Teacher.h" @implementation Teacher -(void)work{ NSLog(@"我 %@要好好讲课工作",self.name); } @end
WorkingPartner.h
#import <Foundation/Foundation.h> @protocol WorkingPartner <NSObject> /** * 工作抽象类方法 */ -(void) work; @end
main.m
#import <Foundation/Foundation.h> #import "Student.h" #import "Teacher.h" int main(int argc, const char * argv[]) { @autoreleasepool { Student *stu1=[Student new]; stu1.name=@"lvdonghui"; Student *stu2=[Student new]; stu2.name=@"caoyan"; Student *stu3=[Student new]; stu3.name=@"xuhao"; Teacher *te=[Teacher new]; te.name=@"yang"; /** * 快速枚举法 */ NSArray *arr=[NSArray arrayWithObjects:stu1,stu2,stu3,te,nil]; for (id<WorkingPartner> p in arr) { [p work]; } /** * NSEnumerator方法 */ NSEnumerator *enu=[arr objectEnumerator]; id<WorkingPartner> i; while (i=[enu nextObject]) { [i work]; } } return 0; }
copy
1、首先,什么是深浅复制?
在复制操作时,对于对象有n层是对象复制,我们可称作n级深复制,此处n应大于等于1。
浅 复 制:在复制操作时,对于被复制的对象的每一层复制都是指针复制。
深 复 制:在复制操作时,对于被复制的对象至少有一层复制是对象复制。
完全复制:在复制操作时,对于被复制的对象的每一层复制都是对象复制。指针复制俗称指针拷贝,对象复制也俗称内容拷贝。
2、不同关键字之间的区别
retain:始终是浅复制。引用计数每次加一。返回对象是否可变与被复制的对象保持一致
copy:对于可变对象为深复制,引用计数不改变;对于不可变对象是浅复制,引用计数每次加一,始终返回一个不可变对象
mutableCopy:始终是深复制,引用计数不改变。始终返回一个可变对象
3、[个人觉得这里对深浅复制讲的还可以(http://www.cnblogs.com/langtianya/p/3722129.html)
做的有点草率,近期会做相应的修改
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 如何选择路由协议
- BGP边界网关协议
- C#、ASP.NET通用扩展工具类之TypeParse
- Lua编程示例(二):面向对象、metatable对表进行扩展
- Windows Powershell扩展类型系统
- C#、ASP.NET通用扩展工具类之LogicSugar
- SQL Server下几个危险的扩展存储过程
- jQuery 学习第七课 扩展jQuery的功能 插件开发
- 运行Node.js的IIS扩展iisnode安装配置笔记
- 一个扩展时间段的dir命令的vbs脚本
- Ruby中使用SWIG编写ruby扩展模块实例
- PHP memcache扩展的三种安装方法
- 用C/C++扩展你的PHP 为你的php增加功能