当前位置:编程学习 > wap >>

ios内存管理

java写了这么多年,遇到自动管理内存还真不适应,问个问题
环境xcode4.5,在ios app应用中,main函数内会有
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([HelloAppDelegate class]));
    }
是不是在@autoreleasepool下的代码都不用手动释放内存了?
看的教程比较老,还是手动的retain和release,还有就是因为写的代码都在vicontroller等其他地方,是不是在也不用手动的释放内存了 --------------------编程问答-------------------- 应该是说如果你的项目使用了ARC的话,就不用自己手动retain,release了,看上去就跟写java一样
@autoreleasepool块是替换原来的自动释放池 --------------------编程问答-------------------- 支持ARC特性的就不需要你自己去释放了。 --------------------编程问答-------------------- 没有任何理由不使用ARC的 --------------------编程问答-------------------- autoreleasepool管理的是在当前域中调用了autorelease方法的对象。如果对象使用了alloc、retain、copy操作,还是需要手动release的。
如果使用了ARC,基本上就可以像使用java一样从内存管理中脱离开了,但仍然会有些细节需要处理。 --------------------编程问答--------------------
引用 3 楼 yiyaaixuexi 的回复:
没有任何理由不使用ARC的

就是说在main中有了ARC,我app里的具体的逻辑代码里就不用手动管理内存了吗? --------------------编程问答--------------------
引用 4 楼 guansong8079776 的回复:
autoreleasepool管理的是在当前域中调用了autorelease方法的对象。如果对象使用了alloc、retain、copy操作,还是需要手动release的。
如果使用了ARC,基本上就可以像使用java一样从内存管理中脱离开了,但仍然会有些细节需要处理。

如果在我的逻辑代码里使用了[[someobject alloc] init]获得一个对象,那么这个对象还需要手动的release,对吗? --------------------编程问答--------------------
引用 6 楼 oklinsong 的回复:
引用 4 楼 guansong8079776 的回复:autoreleasepool管理的是在当前域中调用了autorelease方法的对象。如果对象使用了alloc、retain、copy操作,还是需要手动release的。
如果使用了ARC,基本上就可以像使用java一样从内存管理中脱离开了,但仍然会有些细节需要处理。
如果在我的逻辑代码里使用了[[someobj……

是的! --------------------编程问答--------------------
引用 5 楼 oklinsong 的回复:
引用 3 楼 yiyaaixuexi 的回复:没有任何理由不使用ARC的
就是说在main中有了ARC,我app里的具体的逻辑代码里就不用手动管理内存了吗?

ARC不是指的autoreleasepool。ARC是整个项目的内存管理设置。百度一下ARC吧,好些文章。 --------------------编程问答-------------------- ARC是对objective-c而言的,而且还可以对每个单独的.m文件进行配置,在配置文件中好像有个配置 fno-objective-c的设置来屏蔽是否启用ARC,所以在一个项目里面允许ARC与非ARC共同存在。 --------------------编程问答--------------------
引用 3 楼 yiyaaixuexi 的回复:
没有任何理由不使用ARC的


我有不同意见。ARC会有负作用,而且很严重。很多大项目都要封杀掉。ARC使程序反而不稳定。比如某个对象我想保持住,但使用ARC后,系统自动帮你在“该释放的时候”释放了。但这个“该释放的时候”有时并不是要释放的。

至于楼上说在一个项目里面允许ARC与非ARC共同存在,这个是非常正确的。根据需要可以单独指定。有些第三方的东西必须用ARC,而自己的工程是非ARC,就需要单独配置。 --------------------编程问答--------------------
引用 10 楼 mwy654321 的回复:
引用 3 楼 yiyaaixuexi 的回复:没有任何理由不使用ARC的

我有不同意见。ARC会有负作用,而且很严重。很多大项目都要封杀掉。ARC使程序反而不稳定。比如某个对象我想保持住,但使用ARC后,系统自动帮你在“该释放的时候”释放了。但这个“该释放的时候”有时并不是要释放的。

至于楼上说在一个项目里面允许ARC与非ARC共同存在,这个是非常正确的。根据……


“比如某个对象我想保持住,但使用ARC后,系统自动帮你在“该释放的时候”释放了。”   那是你没有正确使用ARC…… 一个项目里的确允许ARC与非ARC共同存在,绝大多数原因是早期开发的成品接口都是非ARC的,不想改动的整合。 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 如果要考虑效率的问题,还是手动管理。 --------------------编程问答-------------------- 额  好像在你新建项目时   有个选项是提示是否自动释放。    如果你勾选啦   那就不用释放啦。   并且你想释放也不行,  编译会报错 --------------------编程问答-------------------- 不明觉厉,,, --------------------编程问答--------------------
引用 6 楼 oklinsong 的回复:
Quote: 引用 4 楼 guansong8079776 的回复:

autoreleasepool管理的是在当前域中调用了autorelease方法的对象。如果对象使用了alloc、retain、copy操作,还是需要手动release的。
如果使用了ARC,基本上就可以像使用java一样从内存管理中脱离开了,但仍然会有些细节需要处理。

如果在我的逻辑代码里使用了[[someobject alloc] init]获得一个对象,那么这个对象还需要手动的release,对吗?


NO!
NSString *str = [[NSString alloc] initWithUTF8String:"hello, stupid!"];
 [str release];
你确定在开了arc的情况下第二句代码能够编译通过?

- (id)retain OBJC_ARC_UNAVAILABLE;
- (oneway void)release OBJC_ARC_UNAVAILABLE;
- (id)autorelease OBJC_ARC_UNAVAILABLE;
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;

/* OBJC_ARC_UNAVAILABLE: unavailable with -fobjc-arc */
#if !defined(OBJC_ARC_UNAVAILABLE)
#   if __has_feature(objc_arc)
#       if __has_extension(attribute_unavailable_with_message)
#           define OBJC_ARC_UNAVAILABLE __attribute__((unavailable("not available in automatic reference counting mode")))
#       else
#           define OBJC_ARC_UNAVAILABLE __attribute__((unavailable))
#       endif
#   else
#       define OBJC_ARC_UNAVAILABLE
#   endif
#endif --------------------编程问答-------------------- ARC状态,使用对象初始化的时候,只需要去retain,alloc,copy,后边就不需要手动去release了,只管写初始化;
非ARC的状态下,你可以这样写[[someobject alloc] init],但是你使用完someobject的时候要释放即[someobject release];
或者这种写法[[[someobject alloc] init]autorelease];  这样 你后边就不需要去手动release了,这是自动释放池,函数调用完,自动释放池的对象会自动去逐个释放。希望对LZ有用 --------------------编程问答-------------------- http://blog.csdn.net/yangfanacc/article/details/16844975 --------------------编程问答-------------------- 推荐使用ARC --------------------编程问答-------------------- 其实你在创建项目的时候只要选中自动管理内存的那个选项,在项目开发的过程中就不用考虑内存的管理的问题了,当然这不是万能的。你可以看看这个快速入门教程http://ios.itcast.cn/news/20130505/16233286426.shtml?131203zy&csdn
补充:移动开发 ,  iPhone
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,