我经常遇到一个NSArray关于内存的问题,十分不解,举个例子:
test.h
1、@interface test : UITableViewController{
2、 NSArray *documentArray;}
3、@property(retain,nonatomic) NSArray *documentArray;
4、@endtest.m
@implementation test
@synthesize documentArray;
6、- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
7、 self=[super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
8、 if(self!=nil){
9、 documentArray=[[NSArray alloc]initWithObjects: @"aa",@"bb", @"cc",nil];
10、 return self;}
11、..... 我在第3行代码 在property用到了retain ,从理论上上说,documentArray的retainCount已经为1了,so第9行代码可以这样写:
documentArray=[NSArray arrayWithObjects: @"aa",@"bb", @"cc",nil];但是有时候这样写,程序会出现错误,有时候不会出错 纠结中...
test.h
1、@interface test : UITableViewController{
2、 NSArray *documentArray;}
3、@property(retain,nonatomic) NSArray *documentArray;
4、@endtest.m
@implementation test
@synthesize documentArray;
6、- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
7、 self=[super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
8、 if(self!=nil){
9、 documentArray=[[NSArray alloc]initWithObjects: @"aa",@"bb", @"cc",nil];
10、 return self;}
11、..... 我在第3行代码 在property用到了retain ,从理论上上说,documentArray的retainCount已经为1了,so第9行代码可以这样写:
documentArray=[NSArray arrayWithObjects: @"aa",@"bb", @"cc",nil];但是有时候这样写,程序会出现错误,有时候不会出错 纠结中...
用self.documentArray = [NSArray arrayWithObjects: @"aa",@"bb", @"cc",nil];
还是self.documentArray = [[NSArray alloc]initWithObjects: @"aa",@"bb", @"cc",nil];2、问什么有时候用一种会出现错误呢,我保证documentArray只赋值过一次(因为出错的那次练习,中我只需要将集合数组赋一个不变的值,以便在下面的UITableView中运用,so我敢保证)
self.documentArray = [NSArray arrayWithObjects: @"aa",@"bb", @"cc",nil];
NSLog(@"documentArray retainCount:%d",[documentArray retainCount]);NSLog(@"documentArray retainCount:%d",[documentArray retainCount]);
self.documentArray = [[NSArray alloc]initWithObjects: @"aa",@"bb", @"cc",nil];
NSLog(@"documentArray retainCount:%d",[documentArray retainCount];
两种方式的结果在赋值前、后分别相同(赋值前retainCount为0,后为1)为什么有时候出错了呢,纠结中...
self.documentArray = [[NSArray alloc]initWithObjects: @"aa",@"bb", @"cc",nil]; //属性给retain了一下,alloc有一下, 你需要释放2次。
documentArray = [NSArray arrayWithObjects: @"aa",@"bb", @"cc",nil]; //没有retain和alloc,后面用就会异常。
documentArray = [[NSArray alloc]initWithObjects: @"aa",@"bb", @"cc",nil];//alloc了一下,你需要释放1次。其实这个问题说明你对属性(property)的理解不够深入。你可以看一下苹果的这篇文档,还有网上的一些其他资料。
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html
个人建议,除非对象要在另一个类中被使用,不然不要设置成property,内部使用,用成员变量足够了,不需要用到属性。