- // SuperProtocol.h
- #import <Foundation/Foundation.h>
- @protocol SuperProtocol <NSObject>
- //NSObject协议称为基协议,每个协议都应当遵守NSObject协议,就像每个类都应当继承NSObject类一样。
- @required
- - (void)speak;
- - (void)eat;
- - (void)walk;
- @end
复制代码- // SubProtocol.h
- #import <Foundation/Foundation.h>
- #import "SuperProtocol.h"
- @protocol SubProtocol <SuperProtocol>
- //SubProtocol协议遵守SuperProtocol协议,就拥有了SuperProtocol协议中的所有方法声明,类似于继承
- @required //一定要实现@required的方法,否则编译器报警
- - (void)study;
- - (void)speakEnglish;
- @optional //可选,不要求一定实现
- - (void)drive;
- @end
复制代码- // MyProtocol.h
- #import <Foundation/Foundation.h>
- @protocol MyProtocol <NSObject>
- @required
- - (void)drink;
- @optional
- - (void)smoke;
- @end
复制代码
这是3个协议文件的代码
Person类
- // Person.h
- #import <Foundation/Foundation.h>
- #import "SuperProtocol.h"
- @interface Person : NSObject <SuperProtocol>
- @property (nonatomic , assign) NSString *name;
- + (id)person;
- @end
- /*
- 提前声明协议,在.m文件中使用时在import头文件:
- * @protocol 协议名;
-
- 类遵守协议,就拥有了协议中的所有方法声明:
- * Person类拥有了SuperProtocol协议中的所有方法声明
-
- */
复制代码- // Person.m
- #import "Person.h"
- @implementation Person
- + (id)person
- {
- return [[self alloc] init];
- }
- - (void)walk
- {
- NSLog(@"%@走路" , _name);
- }
- - (void)speak
- {
- NSLog(@"%@说话" , _name);
- }
- - (void)eat
- {
- NSLog(@"%@吃东西" , _name);
- }
- - (void)dealloc
- {
- NSLog(@"%@被回收" , _name);
- }
- @end
复制代码
Student类
- // Student.h
- #import "Person.h"
- #import "SubProtocol.h"
- #import "MyProtocol.h"
- @interface Student : Person <SubProtocol , MyProtocol>
- //遵守多个协议
- @property(nonatomic , assign) int number;
- + (id)student;
- @end
- /*
- 类只能继承一个父类,但可以同时遵守多个协议,拥有所有协议中的方法声明
-
- Student类继承自Person类,并且同时遵守SubProtocol协议和MyProtocol协议
- */
复制代码- // Student.m
- #import "Student.h"
- @implementation Student
- + (id)student //快速构造器
- {
- return [[self alloc] init];
- }
- - (void)study
- {
- NSLog(@"%@学习" , self.name);
- }
- - (void)speakEnglish
- {
- NSLog(@"%@说英语" , self.name);
- }
- - (void)drive
- {
- NSLog(@"%@开车" , self.name);
- }
- - (void)drink
- {
- NSLog(@"%@喝" , self.name);
- }
- - (void)smoke
- {
- NSLog(@"%@抽烟" , self.name);
- }
- - (void)dealloc
- {
- NSLog(@"%@被回收" , self.name);
- }
- @end
复制代码
main.m
- // main.
- /*
- protocol:用于声明方法
-
- * 类遵守协议:类就拥有了协议中的方法声明
- * 协议遵守协议:新协议拥有遵守的协议的方法声明,类似继承
- * 遵守多个协议:拥有所有遵守的协议的方法声明(类只能继承一个父类)
-
- protocol限制对象类型:
- 要继承的类名<要遵守的协议名列表> *pointer;
- 例如:Person<protocol1 , protocol2> *p;
- 限制p指向的对象必须继承了Person,并且遵守了protocol1 , protocol2这2个协议
- */
- #import <Foundation/Foundation.h>
- #import "Student.h"
- #import "SuperProtocol.h"
- #import "SubProtocol.h"
- #import "MyProtocol.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- Person<SuperProtocol> *p = [Person person];//限制p的对象类型:必须继承Person类,并且遵守SuperProtocol协议
- p.name = @"张三";
-
- [p eat];
- [p speak];
- [p walk];
-
- Student<SubProtocol , MyProtocol> *s = [Student student];//限制s的对象类型:必须继承自Student类,且遵守SubProtocol , MyProtocol两个协议
-
- s.name = @"李四";
- //[s setName:@"李四"];
- s.number = 999;
-
- //李四遵守了多个协议,拥有这些协议中所有方法声明
- [s eat];
- [s speak];
- [s walk];
- [s study];
- [s speakEnglish];
- [s drive];
- [s drink];
- [s smoke];
- }
- return 0;
- }
复制代码
为什么李四会回收2次???
- 2014-10-23 23:43:09.337 24_protocol基本[1457:303] 张三吃东西
- 2014-10-23 23:43:09.338 24_protocol基本[1457:303] 张三说话
- 2014-10-23 23:43:09.338 24_protocol基本[1457:303] 张三走路
- 2014-10-23 23:43:09.338 24_protocol基本[1457:303] 李四吃东西
- 2014-10-23 23:43:09.339 24_protocol基本[1457:303] 李四说话
- 2014-10-23 23:43:09.339 24_protocol基本[1457:303] 李四走路
- 2014-10-23 23:43:09.339 24_protocol基本[1457:303] 李四学习
- 2014-10-23 23:43:09.339 24_protocol基本[1457:303] 李四说英语
- 2014-10-23 23:43:09.339 24_protocol基本[1457:303] 李四开车
- 2014-10-23 23:43:09.340 24_protocol基本[1457:303] 李四喝
- 2014-10-23 23:43:09.340 24_protocol基本[1457:303] 李四抽烟
- 2014-10-23 23:43:09.340 24_protocol基本[1457:303] 李四被回收
- 2014-10-23 23:43:09.340 24_protocol基本[1457:303] 李四被回收
- 2014-10-23 23:43:09.340 24_protocol基本[1457:303] 张三被回收
复制代码
|
|