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; }