【autorelease的类方法的两点规范 Objective-C语言】

本文详细讲解了Objective-C中的autorelease规则,介绍了如何在类方法中正确使用autorelease以确保对象生命周期管理,并强调了类方法创建对象时自动autorelease的重要性。通过实例和规范说明,帮助开发者理解和应用autorelease的最佳实践。

前言

autorelease的规范:
0)创建对象,将对象存储到自动释放池之中,就不需要再去手动的release。

一、一般情况下,写1个类,会为我们的类写1个类方法,用来让外界调用类方法来快速的得到1个对象

例如:有一个Pig类:
@interface Pig : NSObject
@property(nonatomic,retain)NSString *name;
@property(nonatomic,assign)int age;
@property(nonatomic,assign)float weight;

– (instancetype)initWithName:(NSString *)name andAge:(int)age andWeight:(float)weight;

++(instancetype)pig;

++(instancetype)pigWithName:(NSString *)name andAge:(int)age andWeight:(float)weight;
@end

@implementation Pig
– (void)dealloc
{
NSLog(@“猪挂了。。。”);
[_name release];
[super dealloc];
}
– (instancetype)initWithName:(NSString *)name andAge:(int)age andWeight:(float)weight
{
if(self = [super init])
{
self.name = name;
self.age = age;
self.weight = weight;
}
return self;
}

++(instancetype)pig
{
return [[[self alloc] init] autorelease];
}

++(instancetype)pigWithName:(NSString *)name andAge:(int)age andWeight:(float)weight
{
return [[self alloc] initWithName:name andAge:age andWeight:weight];
}
@end

main.m文件中:
#import <Foundation/Foundation.h>
#import “Person.h”
#iimport “Pig.h”
int main()
{
Pig *p1 = [[Pig alloc] initWithName:@“八戒” andAge: 2 andWeight:260.0f];
Pig *p2 = [Pig pigWithName:@“八戒” andAge: 2 andWeight:260.0f];
@autoreleasepool
{
}
}

二、类方法的第一个规范

1.一般情况下,要求提供与自定义构造方法相同功能的类方法,这样可以快速的创建1个对象

例如:NSString *str = [[NSString alloc] initWithFormat:];
[NSString stringWithFormat:];

2.类方法的第二个规范:

我们一般情况下,写1个类,会为我们的类写1个同名的类方法,用来让外界调用类方法来快速的得到1个对象,
规范:使用类方法创建的对象,要求这个对象在方法当中已经被autorelease过了。
这样,我们只要在自动释放池中,调用类方法来创建对象,那么创建的对象就会被自动的加入到自动释放池当中,就不需要再去手动的autorelease了,
使用对象方法创建的对象,不要求auto release过。。。,例如:
– (instancetype)initWithName:(NSString *)name andAge:(int)age andWeight:(float)weight
{
if(self = [super init])
{
self.name = name;
self.age = age;
self.weight = weight;
}
return self;
}
例如:
++(instancetype)pigWithName:(NSString *)name andAge:(int)age andWeight:(float)weight
{
return [[[self alloc] initWithName:name andAge:age andWeight:weight] autorelease];
}

main.m文件中:
@autoreleasepool
{
Pig *p1 = [Pig pigWithName:@“猪猪” andAge: 1 andWeight:100.0f];
}

总结

就是如果通过一个类方法,返回1个当前对象,那这个对象就已经是autorelease过了的,但是,通过对象方法,没有auto release过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风清晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值