延展
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)
做的有点草率,近期会做相应的修改