ios內存管理

tags:    時間:2013-12-03 18:40:27
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

推薦閱讀文章

Bookmark the permalink ,來源:互聯網