新人,关于内存计数,求解惑,下面哪些情况下需要手动release呀

金色闪光 2014-10-30 12:10:04
RT,只知道retain 和 alloc 是肯定要 手动release的

但是还有很多函数 我不知道它究竟有没有分配需要我手动release的内存呀

比如
1.
NSString *a = [NSString stringwith.....]; 或者 initwithstring 这类需要手动release么

2.
一个函数或者函数的循环体中 写了一个 NSDictionary * tmp = a; 或者 NSArray*b = c;tmp和b需要手动释放么

3.
一个类里面有一个NSDictionary *a; 或者 NSArray*b;然后在函数里面给它门赋值,下一次调用这个函数之前 需要给他们释放么?

4.比如一个网络接收函数里面定义了一个接收数据的NSData*a,我把他用函数返回值的形式赋值给一个NSDictionary*dd,那么这个dd和a需要手动释放么

...全文
156 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
金色闪光 2014-10-31
  • 打赏
  • 举报
回复
引用 1 楼 zhanglei5415 的回复:
1.NSString *a = [NSString stringwith.....] 这个函数创建出来的对象是个autorelease 的, 所以不需要你在使用完后再release。 而initWithString:包括其它的创建对象的方法,只要是以init开头的实例方法 retainCount都会加1 ,在使用完后都需要手动去release 2. tmp和b 不需要手动释放 3. NSDictionary *a 如果在类中是一个成员变量,而没有定义成属性,这时需要你手动retain它,不然这样的对象会在某一时刻被释放回收,而导致程序异常。所以需要我们对它进行retain 操作 [a retain]. 在类的生命周期中,在类的dealloc方法中再去释放它release 4. 函数的返回值为NSData ,对于函数返回值的内存管理是这样的。一般的我们会在函数返回的时候,返回一个autorelease的对象(前提是这个对象是自己可管理的,实例的retaincount 为1的,如果本身就是一个autorelease对象可直接返回),这样外部在调用这个函数的时候就不用担心内存管理的问题。因为这个对象被加入到了autoreleasePool(自动释放池)中。而调用它得到的对象在某种情况下还是需要使用retain 来让它驻在内存中的。
谢谢了
kasense 2014-10-31
  • 打赏
  • 举报
回复
ios6 NSString 不需要释放。
ReyZhang 2014-10-30
  • 打赏
  • 举报
回复
1.NSString *a = [NSString stringwith.....] 这个函数创建出来的对象是个autorelease 的, 所以不需要你在使用完后再release。 而initWithString:包括其它的创建对象的方法,只要是以init开头的实例方法 retainCount都会加1 ,在使用完后都需要手动去release 2. tmp和b 不需要手动释放 3. NSDictionary *a 如果在类中是一个成员变量,而没有定义成属性,这时需要你手动retain它,不然这样的对象会在某一时刻被释放回收,而导致程序异常。所以需要我们对它进行retain 操作 [a retain]. 在类的生命周期中,在类的dealloc方法中再去释放它release 4. 函数的返回值为NSData ,对于函数返回值的内存管理是这样的。一般的我们会在函数返回的时候,返回一个autorelease的对象(前提是这个对象是自己可管理的,实例的retaincount 为1的,如果本身就是一个autorelease对象可直接返回),这样外部在调用这个函数的时候就不用担心内存管理的问题。因为这个对象被加入到了autoreleasePool(自动释放池)中。而调用它得到的对象在某种情况下还是需要使用retain 来让它驻在内存中的。

29,050

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧