一直存在一个疑惑,就是如果在一个方法中使用到了NSString,那这个NSString对象是否需要调用dealloc方法释放内存呢?
诸如:
-(void) test { NSString *str1 = [NSString stringWithFormat:@"fast, %@", @"呵呵"]; NSLog(@"%@", str1);
NSString *str2 = [[NSString alloc] initWithFormat:@"fast, 呵呵"]; NSLog(@"%@", str2); } |
是否使用完毕就不用管了呢,objective-c帮我们完成后续的所有清理工作?
遗憾的是,事实并不是这样的!
google了一下,获得以下有价值的情报
参见帖子: [[NSString alloc] initWith......]与[NSString stringWith......]有什么区别?
http://www.cocoachina.com/bbs/read.php?tid-6671.html
MVP言论:
1。用了alloc的就需要手动release,
[NSString stringWith......] 相当于 [[[NSString alloc] initWith......] autorelease],编译器自己会release
2。alloc, new 都需要自己release
3。一个是类方法,一个是实例方法
类方法都相当于自动声明 autorelease
实例方法需要 自己声明或手动释放
4。后者是atuorelease,后者如果要release要retain一下!!
参照上述言论,得出结论,像下面这么写都是没问题的:
-(void) test { NSString *autoReleaseStr = [NSString stringWithFormat:@"fast, %@", @"呵呵"]; NSLog(@"%@", autoReleaseStr);
NSString *notAutoReleaseStr = [[NSString alloc] initWithFormat:@"fast, 呵呵"]; NSLog(@"%@", notAutoReleaseStr); [notAutoReleaseStr release]; } |
-(void) test { NSString *autoReleaseStr = [NSString stringWithFormat:@"fast, %@", @"呵呵"]; NSLog(@"%@", autoReleaseStr); [autoReleaseStr retain]; [autoReleaseStr release];
NSString *notAutoReleaseStr = [[NSStringalloc]initWithFormat:@"fast,呵呵"]; NSLog(@"%@", notAutoReleaseStr); [notAutoReleaseStrdealloc]; } |
不过我还是有一个疑问:
[notAutoReleaseStr dealloc] 与 [notAutoReleaseStr release] 到底有什么区别?
找到了一个帖子:
[一般问题] dealloc和release的区别?
当使用release方法当reference counter值为0时会自动使用dealloc方法。