Objective-C内存管理——retain属性

先看一个例子:


ViewController.h

@interface ViewController : UIViewController{
    NSString *iVal1;
}
@property (nonatomic,retain)NSString *iVal1;

@end

定义一个变量,并生成retain属性。


ViewController.m

@synthesize iVal1;

实现settergetter方法。


ViewController2.m

#import "ViewController.h"
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *iVal2 = @"xml_eason";
    NSString *iVal3 = [NSString stringWithFormat:@"%@",iVal2];
    ViewController *viewController = [[[ViewController alloc]init]autorelease];
    viewController.iVal1 = iVal3;
}

这样就内存遗漏了!~~



1. retain属性需要在本类的实现文件的dealloc函数中release掉。

2. 因为本类中retain属性自带一次retain,所以需要在deallocrelease之。不管在本类中,还是其他类中用到此属性,只要照顾好自己这一块就好了,就是把她当成普通的变量,如果计数+1了,-1ok了。

3. ViewController.h里的self.iVal1ViewController2.h里的viewController.iVal1是一样的,都是“对象.属性 

4. ①本例中viewController.iVal1 = iVal3;是用“=”assign赋值的,不会计数+1,所以不用release

    ②其他类中viewController.iVal1 = [[NSString alloc]initWithString:iVal3];一般,一个类用到其他类的属性,并不会对其重新初始化并赋初值。所以,不要这样操作。

    ③本类中self.iVal1 =  [[NSString alloc]initWithString:@"xml_eason"];在本类的某方法中alloc了,计数+1,所以要在本方法中对其autorelease或者release。因为iVal1retain属性,她还有一个计数的,在其他方法中依然可以使用,只要保证本方法内的计数守恒即可。

     ④本类中iVal1 = [[NSString alloc]initWithString:@"xml_eason"];此处没有使用属性而是成员变量,除了定义处,其他地方self.iVal1iVal1等价的。因为iVal1已经在deallocrelease了,所以不可对她releaseautorelease

         反而,在本类的某方法(比如A)中定义了iVal1 = [NSString stringWithString:@"xml_eason"];如果其他方法也要使用的话,需要方法AiVal1定义处需要retain一次。因为工厂方法赋值,出了本函数(方法),iVal1已经autorelease了,计数为0,不能再用了。


总之,retain属性需要在deallocrelease,然后其他地方和普通变量一样。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值