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

时间:2023-11-26 21:06:20
、autorelease的应用场景

经常用来在类方法中快速创建1个对象。
// 声明实现一个类方法
+ (Student *)student
{
// 在里面直接进行autorelease
return [[[Student alloc] init] autorelease];
}
应用:
// 在自动释放池中使用类方法创建对象
@autoreleasepool{
// 此时创建出来的对象不用关注释放问题。
Student *s = [Student student];
}
错误写法: int main(){
// 在自动释放池中使用类方法创建对象
@autoreleasepool{ }
// 写在自动释放池外部将无法释放对象。
Student *s = [Student student];
reutrn ;
}
、完善快速创建对象的方法 问题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:] autorelease]; // 通过类方法,初始化学生对象
Student *stu1 = [Student studentWithAge:]; // 输出结果
NSLog(@"age = %d",stu1.age);
}
return ; }