黑马程序员技术交流社区

标题: autorelease的使用-笔记分享 [打印本页]

作者: liulunjiang    时间: 2015-10-25 11:40
标题: autorelease的使用-笔记分享
目的:创建Person类,Student子类继承Person,创建一个Person类的person类方法,哪个类调用就创建自己类的对象并自动加入到释放池。重写dealloc方法来体现出自动释放池程序段结束后已各自自动释放。

main.m
  1. #import <Foundation/Foundation.h>
  2. #import "Person.h"
  3. #import "Student.h"

  4. int main(int argc, const char * argv[]) {
  5.     @autoreleasepool {
  6.         Person *p=[Person person];
  7.         p.name=@"Human";
  8.         [p run];

  9.         Student *stu=[Student person]; //动态类型,直到程序执行时才知道stu是什么类型
  10.         stu.name=@"Little boy";
  11.         [stu run];
  12.         
  13.         /* 存在问题:
  14.          当写入语句
  15.          NSString *str=[Student person];
  16.          的时候,能体现出person类方法的返回值类型用instancetype而不用id的区别,用instancetype能检查出返回类型为student类型而目标类型为Nsstring *类型的不匹配,系统会提出警告,而用id不能检查到。
  17.          */
  18.     }
  19.     return 0;
  20. }
复制代码

Person.h
  1. #import <Foundation/Foundation.h>

  2. @interface Person : NSObject
  3. @property(nonatomic,copy)NSString *name;
  4. -(void)run;
  5. +(instancetype)person;
  6. @end
复制代码

Person.m
  1. #import "Person.h"

  2. @implementation Person
  3. -(void)dealloc{
  4.     NSLog(@"Person:%@----dealloc!",self.name);
  5.     [super dealloc];
  6. }
  7. +(instancetype)person{
  8.     return [[[self alloc]init]autorelease];//为了Student *stu=[Student person];创建的不是Person类的对象,而是Student类的对象,这样可以调用Student类自己的run方法。
  9. }
  10. -(void)run{
  11.     NSLog(@"Person:%@ is running!",self.name);
  12. }
  13. @end
复制代码

Student.h
  1. #import "Person.h"

  2. @interface Student : Person
  3. -(void)run;
  4. @end
复制代码

Student.m
  1. #import "Student.h"

  2. @implementation Student
  3. -(void)run{
  4.     NSLog(@"Student:%@ is running!",self.name);
  5. }
  6. -(void)dealloc{
  7.     NSLog(@"Student:%@----dealloc!",self.name);
  8.     [super dealloc];//调用父类的dealloc方法
  9. }
  10. @end
复制代码





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