Sian 发表于 2014-3-19 23:19:10

将autorelease写入类方法的例子

1、出发点:
在autoreleasepool中如:
@autoreleasepool {
      Person * p = [[ init] autorelease];
      ......
}
红色部分代码经常需要重复性写,所以需要想个办法将该代码省略掉或替换掉,因此才有了使用一个类方法来返回初始化并autorelease的方法来解决该问题
+ (id)person
{
      return [[ init] autorelease];
}
然后在创建对象时,只需要Person * p = ;即可

2、既然通过一个类方法可以完成上述功能,在此基础之上其实还可以完成更多的功能,比如顺便传递一个参数进去进行初始化对象,类似初始化方法能完成的功能;
+ (id)personWithAge:(int)age
{
      Person * p = ;
      p.age = age;
      return p;
}
这样一来即完成了初始化+autorelease并将age初始值传到创建的对象中

3、考虑到子类也需要用到此方法,可以将self替换掉Person更为严谨,否则子类只能重写该方法;

参考代码:

Person.h
//
//Person.h
//Autorelease-1
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic, assign) int age;

// 声明一个带自动释放功能的类方法
+ (id)person;

// 声明一个带自动释放且传age参数的类方法
+ (id)personWithAge:(int)age;

@end

Person.m
//
//Person.m
//Autorelease-1
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import "Person.h"

@implementation Person

+ (id)person
{
    //直接返回带初始化与autorelease的对象,省去在创建方法时重复的代码
    return [[ init] autorelease];
}

// 对类方法person进行升级改造,不仅可完成初始化与自动释放,还可以接受一个age的参数给新对象,扩展了原始方法的功能
+ (id)personWithAge:(int)age
{

    // 创建一个对象并调用person方法完成初始化与自动释放的功能,考虑到子类的使用,用self表示当前类的行为
    // 这需要与person方法结果,person方法同样用self来表示当前类
    Person * p = ;
    // 如果子类继承该方法,由于"多态"的特性,创建一个Person类型的指针,指向一个Student类型的对象是完全没有问题的
   
    // 对象分配空间并初始化之后将该对象的age赋值
    p.age = age;
   
    // 返回该对象为方法调用者
    return p;

}

- (void)dealloc
{
    // 在释放之前输出一行信息,直观表示该方法被调用,使用对象本身与_age来区分具体对象
    NSLog(@"%@ is dealloc, age = %d", self, _age);
   
    ;
}

@end

Student.h
//
//Student.h
//Autorelease-1
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import "Person.h"

@interface Student : Person

@property (nonatomic, assign) double height;

@end

Student.m
//
//Student.m
//Autorelease-1
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import "Student.h"

@implementation Student

@end

main.m
//
//main.m
//Autorelease-1
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "student.h"

int main()
{
    // 创建一个自动释放池
    @autoreleasepool{
      
      // Person * p = ;
      
      // 创建一个Person对象并使用personWithAge:方法进行初始化,检验自动释放池被释放后该对象是否会自动释放
      Person * p = ;
      
      // 创建一个Person子类Student对象,子类继承父类的功能,是否能够达到同样的效果
      Student * s = ;
      
      // 创建对象成功的标志,即对象可对新成员变量(父类中没有的)进行操作
      s.height = 173;
      
      NSLog(@"s.height = %.2f", s.height);
      
    }
   
    return 0;
}
运行结果:2014-03-19 23:05:36.560 Autorelease-1 s.height = 173.002014-03-19 23:05:36.561 Autorelease-1 <Student: 0x100107b60> is dealloc, age = 122014-03-19 23:05:36.562 Autorelease-1 <Person: 0x100102fe0> is dealloc, age = 20Program ended with exit code: 0


页: [1]
查看完整版本: 将autorelease写入类方法的例子