0c-36-自动释放池应用场景

1、autorelease的应用场景

经常用来在类方法中快速创建1个对象。
// 声明实现一个类方法
+ (Student *)student
{
  // 在里面直接进行autorelease
  return [[[Student alloc] init] autorelease];
}
应用:
// 在自动释放池中使用类方法创建对象
@autoreleasepool{
// 此时创建出来的对象不用关注释放问题。
Student *s = [Student student];
}
错误写法:

int main(){
// 在自动释放池中使用类方法创建对象
@autoreleasepool{

}
// 写在自动释放池外部将无法释放对象。
Student *s = [Student student];
reutrn 0;
}
2、完善快速创建对象的方法

问题1:如果定1个GoodStudent,继承自Student,此时,还能使用类方法快速创建对象吗?

解决方案:

在类方法中使用id
+ (id)student
{
return [[[Student alloc] init] autorelease];
}
此时,返回的对象仍旧是Student.所以,应该用self,替代Student.

问题2:用其他对象类型,接受自定义对象类型。
如:
  NSString *s = [Student student];
  NSLog(@"%lu",s.length);
这段代码,编译时,不会报任何警告,但是运行时会直接崩溃。
改进办法:

//instancetype:可以动态判断返回的类型和接受的类型是否一致
+ (instancetype)student{

  return [[self alloc] init];
}
此时,编译器会警告
  NSString *s = [Student student];
  NSLog(@"%lu",s.length);
【理解】应用:创建1个学生类初始化年龄

思考&实现1:

创建一个学生类Student,通过重写构造方法实现创建学生对象的时候,默认的年龄值指定的年龄。
// 声明文件
#import <Foundation/Foundation.h>
@interface Student : NSObject
// 年龄属性
@property(nonatomic,assign) int age;

// 自定义构造方法
-(instancetype)initWithAge:(int)age;

// 自定义类方法
+(instancetype)studentWithAge:(int)age;
@end


// 实现文件
#import "Student.h"
@implementation Student

- (void)dealloc
{
NSLog(@"Student 被释放");
[super dealloc];
}

//自定义构造方法
-(instancetype)initWithAge:(int)age
{
if (self = [super init])
{
_age = age;
}
return self;
}

//自定义初始化方法
+(instancetype)studentWithAge:(int)age
{
return [[[self alloc] initWithAge:age] autorelease];
}
@end

// 主函数
#import <Foundation/Foundation.h>
#import "Student.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {

// 通过构造方法,初始化学生对象
Student *stu = [[[Student alloc] initWithAge:10] autorelease];

// 通过类方法,初始化学生对象
Student *stu1 = [Student studentWithAge:100];

// 输出结果
NSLog(@"age = %d",stu1.age);
}
return 0; }
原文地址:https://www.cnblogs.com/yaowen/p/5315676.html