先看一个例子:
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,然后其他地方和普通变量一样。