黑马程序员技术交流社区

标题: protocol的内存管理出问题了,大家来瞄瞄 [打印本页]

作者: 崔石炫    时间: 2014-10-23 23:43
标题: protocol的内存管理出问题了,大家来瞄瞄
  1. //  SuperProtocol.h
  2. #import <Foundation/Foundation.h>

  3. @protocol SuperProtocol <NSObject>
  4. //NSObject协议称为基协议,每个协议都应当遵守NSObject协议,就像每个类都应当继承NSObject类一样。

  5. @required
  6. - (void)speak;
  7. - (void)eat;
  8. - (void)walk;

  9. @end
复制代码
  1. //  SubProtocol.h
  2. #import <Foundation/Foundation.h>
  3. #import "SuperProtocol.h"

  4. @protocol SubProtocol <SuperProtocol>
  5. //SubProtocol协议遵守SuperProtocol协议,就拥有了SuperProtocol协议中的所有方法声明,类似于继承

  6. @required //一定要实现@required的方法,否则编译器报警
  7. - (void)study;
  8. - (void)speakEnglish;

  9. @optional //可选,不要求一定实现
  10. - (void)drive;

  11. @end
复制代码
  1. //  MyProtocol.h
  2. #import <Foundation/Foundation.h>

  3. @protocol MyProtocol <NSObject>

  4. @required
  5. - (void)drink;

  6. @optional
  7. - (void)smoke;

  8. @end
复制代码

这是3个协议文件的代码

Person类
  1. //  Person.h
  2. #import <Foundation/Foundation.h>
  3. #import "SuperProtocol.h"

  4. @interface Person : NSObject <SuperProtocol>

  5. @property (nonatomic , assign) NSString *name;
  6. + (id)person;

  7. @end

  8. /*
  9. 提前声明协议,在.m文件中使用时在import头文件:
  10. * @protocol 协议名;

  11. 类遵守协议,就拥有了协议中的所有方法声明:
  12. * Person类拥有了SuperProtocol协议中的所有方法声明

  13. */
复制代码
  1. //  Person.m
  2. #import "Person.h"

  3. @implementation Person

  4. + (id)person
  5. {
  6.     return [[self alloc] init];
  7. }

  8. - (void)walk
  9. {
  10.     NSLog(@"%@走路" , _name);
  11. }

  12. - (void)speak
  13. {
  14.     NSLog(@"%@说话" , _name);
  15. }

  16. - (void)eat
  17. {
  18.     NSLog(@"%@吃东西" , _name);
  19. }

  20. - (void)dealloc
  21. {
  22.     NSLog(@"%@被回收" , _name);
  23. }

  24. @end
复制代码

Student类
  1. //  Student.h
  2. #import "Person.h"
  3. #import "SubProtocol.h"
  4. #import "MyProtocol.h"

  5. @interface Student : Person <SubProtocol , MyProtocol>
  6. //遵守多个协议

  7. @property(nonatomic , assign) int number;
  8. + (id)student;

  9. @end

  10. /*
  11. 类只能继承一个父类,但可以同时遵守多个协议,拥有所有协议中的方法声明

  12. Student类继承自Person类,并且同时遵守SubProtocol协议和MyProtocol协议
  13. */
复制代码
  1. //  Student.m
  2. #import "Student.h"

  3. @implementation Student

  4. + (id)student //快速构造器
  5. {
  6.     return [[self alloc] init];
  7. }

  8. - (void)study
  9. {
  10.     NSLog(@"%@学习" , self.name);
  11. }

  12. - (void)speakEnglish
  13. {
  14.     NSLog(@"%@说英语" , self.name);
  15. }

  16. - (void)drive
  17. {
  18.     NSLog(@"%@开车" , self.name);
  19. }

  20. - (void)drink
  21. {
  22.     NSLog(@"%@喝" , self.name);
  23. }

  24. - (void)smoke
  25. {
  26.     NSLog(@"%@抽烟" , self.name);
  27. }

  28. - (void)dealloc
  29. {
  30.     NSLog(@"%@被回收" , self.name);
  31. }

  32. @end
复制代码

main.m
  1. //  main.
  2. /*
  3. protocol:用于声明方法

  4. * 类遵守协议:类就拥有了协议中的方法声明
  5. * 协议遵守协议:新协议拥有遵守的协议的方法声明,类似继承
  6. * 遵守多个协议:拥有所有遵守的协议的方法声明(类只能继承一个父类)

  7. protocol限制对象类型:
  8. 要继承的类名<要遵守的协议名列表> *pointer;
  9. 例如:Person<protocol1 , protocol2> *p;
  10. 限制p指向的对象必须继承了Person,并且遵守了protocol1 , protocol2这2个协议
  11. */
  12. #import <Foundation/Foundation.h>
  13. #import "Student.h"
  14. #import "SuperProtocol.h"
  15. #import "SubProtocol.h"
  16. #import "MyProtocol.h"

  17. int main(int argc, const char * argv[])
  18. {
  19.     @autoreleasepool {
  20.         Person<SuperProtocol> *p = [Person person];//限制p的对象类型:必须继承Person类,并且遵守SuperProtocol协议
  21.         p.name = @"张三";
  22.         
  23.         [p eat];
  24.         [p speak];
  25.         [p walk];
  26.         
  27.         Student<SubProtocol , MyProtocol> *s = [Student student];//限制s的对象类型:必须继承自Student类,且遵守SubProtocol , MyProtocol两个协议
  28.         
  29.         s.name = @"李四";
  30.         //[s setName:@"李四"];
  31.         s.number = 999;
  32.         
  33.         //李四遵守了多个协议,拥有这些协议中所有方法声明
  34.         [s eat];
  35.         [s speak];
  36.         [s walk];
  37.         [s study];
  38.         [s speakEnglish];
  39.         [s drive];
  40.         [s drink];
  41.         [s smoke];
  42.     }
  43.     return 0;
  44. }
复制代码

为什么李四会回收2次???
  1. 2014-10-23 23:43:09.337 24_protocol基本[1457:303] 张三吃东西
  2. 2014-10-23 23:43:09.338 24_protocol基本[1457:303] 张三说话
  3. 2014-10-23 23:43:09.338 24_protocol基本[1457:303] 张三走路
  4. 2014-10-23 23:43:09.338 24_protocol基本[1457:303] 李四吃东西
  5. 2014-10-23 23:43:09.339 24_protocol基本[1457:303] 李四说话
  6. 2014-10-23 23:43:09.339 24_protocol基本[1457:303] 李四走路
  7. 2014-10-23 23:43:09.339 24_protocol基本[1457:303] 李四学习
  8. 2014-10-23 23:43:09.339 24_protocol基本[1457:303] 李四说英语
  9. 2014-10-23 23:43:09.339 24_protocol基本[1457:303] 李四开车
  10. 2014-10-23 23:43:09.340 24_protocol基本[1457:303] 李四喝
  11. 2014-10-23 23:43:09.340 24_protocol基本[1457:303] 李四抽烟
  12. 2014-10-23 23:43:09.340 24_protocol基本[1457:303] 李四被回收
  13. 2014-10-23 23:43:09.340 24_protocol基本[1457:303] 李四被回收
  14. 2014-10-23 23:43:09.340 24_protocol基本[1457:303] 张三被回收
复制代码








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2