java写了这么多年,遇到自动管理内存还真不适应,问个问题
环境xcode4.5,在ios app应用中,main函数内会有
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([HelloAppDelegate class]));
}
是不是在@autoreleasepool下的代码都不用手动释放内存了?
看的教程比较老,还是手动的retain和release,还有就是因为写的代码都在vicontroller等其他地方,是不是在也不用手动的释放内存了
环境xcode4.5,在ios app应用中,main函数内会有
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([HelloAppDelegate class]));
}
是不是在@autoreleasepool下的代码都不用手动释放内存了?
看的教程比较老,还是手动的retain和release,还有就是因为写的代码都在vicontroller等其他地方,是不是在也不用手动的释放内存了
解决方案 »
- object-c的retain和release问题
- iphone访问jsp拨号程序报safi无法连接错误,懂的提点下
- 1419935402
- 如何画不规则曲线,以及判断某个点是否在这2条曲线之内?
- 左侧滑动抽屉View放了一个tableView(或者任何控件),都无法与之交互(点击,滑动等等)
- shareSDK 怎样实现第三方登录?
- 关于navigationController 返回上问题
- 分享一套IBM Cognos Report studio技术的商业智能解决方案
- AFNetworking如何传一个对象
- xcode7,storyboard和xib文件哪种形式方便?
- xcode代码提示
- xcode 如何读取远程得xml
@autoreleasepool块是替换原来的自动释放池
如果使用了ARC,基本上就可以像使用java一样从内存管理中脱离开了,但仍然会有些细节需要处理。
我有不同意见。ARC会有负作用,而且很严重。很多大项目都要封杀掉。ARC使程序反而不稳定。比如某个对象我想保持住,但使用ARC后,系统自动帮你在“该释放的时候”释放了。但这个“该释放的时候”有时并不是要释放的。至于楼上说在一个项目里面允许ARC与非ARC共同存在,这个是非常正确的。根据需要可以单独指定。有些第三方的东西必须用ARC,而自己的工程是非ARC,就需要单独配置。
“比如某个对象我想保持住,但使用ARC后,系统自动帮你在“该释放的时候”释放了。” 那是你没有正确使用ARC…… 一个项目里的确允许ARC与非ARC共同存在,绝大多数原因是早期开发的成品接口都是非ARC的,不想改动的整合。
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的状态下,你可以这样写[[someobject alloc] init],但是你使用完someobject的时候要释放即[someobject release];
或者这种写法[[[someobject alloc] init]autorelease]; 这样 你后边就不需要去手动release了,这是自动释放池,函数调用完,自动释放池的对象会自动去逐个释放。希望对LZ有用