您的位置:首页 > 移动开发 > Objective-C

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

2012-09-17 18:37 211 查看
先看一个例子:

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

@end

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

ViewController.m
@synthesize iVal1;

实现setter和getter方法。

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,所以需要在dealloc中release之。不管在本类中,还是其他类中用到此属性,只要照顾好自己这一块就好了,就是把她当成普通的变量,如果计数+1了,-1就ok了。
3. ViewController.h里的self.iVal1和ViewController2.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。因为iVal1是retain属性,她还有一个计数的,在其他方法中依然可以使用,只要保证本方法内的计数守恒即可。
     ④本类中iVal1 = [[NSString alloc]initWithString:@"xml_eason"];此处没有使用属性而是成员变量,除了定义处,其他地方self.iVal1和iVal1等价的。因为iVal1已经在dealloc中release了,所以不可对她release或autorelease。
         反而,在本类的某方法(比如A)中定义了iVal1 = [NSString stringWithString:@"xml_eason"];如果其他方法也要使用的话,需要方法A中iVal1定义处需要retain一次。因为工厂方法赋值,出了本函数(方法),iVal1已经autorelease了,计数为0,不能再用了。

总之,retain属性需要在dealloc中release,然后其他地方和普通变量一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml getter setter interface
相关文章推荐