ARC及内存

本文详细介绍了ARC(自动引用计数)在Objective-C中的使用规则,包括strong强引用与weak弱引用的区别,以及如何避免内存泄露,特别是针对定时器和延时执行方法的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                             ARC的使用
ARC 的规则非常简单:只要还有一个变量指向对象,对象就会保持在内存中。使用ARC后,不需要再手动调用retain, release, autorelease, 因为编译器处理了一切。

新关键字strong,__strong, weak, __weak(“__”为双下划线,(unsafe_unretained,__unsafe_unretained为iOS4.0不支持weak而使用,等同于assign,目前可以不考虑)strong 强引用等同于非ARC的retain

@property (nonatomic, retain) 改为使用@property (nonatomic, strong)

成员变量默认也为strong属性,可写作__strong NSString *str; 或省略直接写为NSString *str;

方法中的strong变量,在方法后会自动释放,类的strong成员变量在类释放时会自动释放。 

weak 弱引用
与assign类似,但不全相同。当对象释放时会自动设置为nil而不需显式的设置。

page1image5000page1image5160

如:
__weak NSString *testStr;- (void)test
{

NSString *abc = [NSString stringWithFormat:@"abc"];testStr = abc;

abc = [NSString stringWithFormat:@"def"];

// testStr会自动等于nil, 即使没有立刻变为nil,在下一个程序循环中也会变为nil,这点与assign不同,assign仍然会有指向空地址的指针,需要手动设为nil,否则再使用就造成crash

}
delegate及xib的outlet 的属性应该设置为@property @property (nonatomic, weak)

copy和之前的copy一样,复制一个对象并创建strong关联

注意点只要还有一个变量指向对象,对象就会保持在内存中。处理不好就会造成对象不会释放。
如:

page2image4816page2image4976

NSTimerNSTimer *timer;

timer = [NSTimer scheduledTimerWithTimeInterval:1 target:selfselector:@selector(timerAction) userInfo:nil repeats:YES];

timer的repeat会对self有引用,而self也对timer有引用,即使页面返回了,self及timer也不会释放。

解决方法是,在页面返回前停止timer [timer_ invalidate],可视实际情况放在viewWillDisapper里执行。(放在dealloc没用,页面没有释放不会执行dealloc)

延时执行

[self performSelector:@selector(delayFunc) withObject:nilafterDelay:5];

即使页面返回,也必须等此延时方法执行后才会释放。因此需要在页面返回前执行

[NSObject cancelPreviousPerformRequestsWithTarget:self];

(当然这里指的是一般情况,必须要此方法执行的话可以不用写这句,特殊情况特殊处理:)

备注:

不过 ARC 只能作用于 Objective-C 对象,不能释放 Core Foundation对象。 因此这里你仍然需要调用 CFRelease()来释放该对象。

另外提一些图片内存问题:

imageView ,置的 frame 大小必片素材一致,否会自动执行拉伸理。(此@2x 图长宽是偶数,否无法frame 与素材一致,当然实现了图片的放的方法的话应该没有问题


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值