黑马程序员技术交流社区

标题: 关于内存管理字符串的一个问题 [打印本页]

作者: 欧翔    时间: 2014-5-20 20:42
标题: 关于内存管理字符串的一个问题
本帖最后由 欧翔 于 2014-5-21 11:11 编辑

提问为什么对象里的NSString要用retain,字符串不是autorelease吗?
  1. #import <Foundation/Foundation.h>

  2. @interface User : NSObject
  3. @property (nonatomic, retain) NSString *name;

  4. @end

  5. #import "User.h"

  6. @implementation User
  7. -(void)dealloc{
  8.     [_name release];
  9.     NSLog(@"内存释放");
  10.     [super dealloc];
  11. }
  12. @end

  13. #import <Foundation/Foundation.h>
  14. #import "User.h"


  15. int main(int argc, const char * argv[])
  16. {
  17.     @autoreleasepool{
  18.      User *p1 = [[User alloc] init];
  19.     p1.name = @"sdadad";
  20.     [p1 release];
  21. }
  22.              return 0;
  23. }
复制代码

作者: S捭K阖Y    时间: 2014-5-20 21:08
谁retain谁release,你在user类中的dealloc方法里[_name release]释放掉了字符串的内存空间,当然要在user类中retain那个字符对象name了,如果在别处释放可能不安全
作者: 欧翔    时间: 2014-5-20 21:15
S捭K阖Y 发表于 2014-5-20 21:08
谁retain谁release,你在user类中的dealloc方法里[_name release]释放掉了字符串的内存空间,当然要在user ...

假如不用retain,在dealloc里面不用release,那么那个字符串的内存空间会释放么
作者: S捭K阖Y    时间: 2014-5-20 21:33
欧翔 发表于 2014-5-20 21:15
假如不用retain,在dealloc里面不用release,那么那个字符串的内存空间会释放么 ...

没有释放的话那块内存空间不会释放
作者: 欧翔    时间: 2014-5-20 21:37
S捭K阖Y 发表于 2014-5-20 21:33
没有释放的话那块内存空间不会释放

谢谢啦,
作者: 奇迹    时间: 2014-5-20 23:23
retain是对象计数+1,
autorelease 是交给池子,然后池子会帮你减一




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2