免費開源的iOS開發學習平臺

                                                Objective-C內存管理

                                                內存管理的核心工作就是及時清理回收不用的內存空間,以便高效的利用內存空間。在面向對象編程開發中,內存管理的核心就是管理對象的釋放。當一個對象不再被使用時,需要及時從內存中清除。

                                                引用計數(Reference Count)

                                                引用計數是在Objective-C中用于管理對象生命周期的機制,這種機制可以很有效的管理對象的生命周期。當一個對象被創建時,它的引用計數為1。每當有新的指針指向這個對象時,這個對象的引用計數就加1。當某個指針不再指向這個對象時,該對象的引用計數減1。當該對象的引用計數為0時,該對象就被自動銷毀,占用的內存被回收。

                                                對于引用計數的理解,也可以用放風箏做個比喻。比如說風箏就是一個對象,最開始時,會有一個人拉著一根線不讓風箏飛走,當再有人來時,會給這個風箏再加1根線,這時,這個風箏就有兩根線牽著,其中任何一根線斷掉,風箏都不會飛走,只有當兩根線都斷掉時,風箏才會飛走。引用計數也基本符合這個道理。

                                                MRC(Manual Reference Counting)

                                                MRC,即手工引用計數。在Xcode4.2版本之前,對象的引用計數都需要程序員來手工管理,因此,程序員需要花費大量的經歷來管理對象的創建與銷毀,其中一個最基本的原則就是:誰創建誰銷毀。

                                                在MRC中,程序員需要手工管理對象的引用計數,在NSObject類中,有關引用計數有如下常用方法。

                                                • 引用計數加一
                                                - (instancetype)retain OBJC_ARC_UNAVAILABLE;
                                                
                                                • 引用計數減一
                                                - (oneway void)release OBJC_ARC_UNAVAILABLE;
                                                
                                                • 獲取對象當前的引用計數
                                                - (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;
                                                

                                                MRC測試

                                                • 新建一個命令行工具工程

                                                • 在TARGETS設置中,為main.m文件添加-fno-objc-arc編譯標示

                                                • 在main.m文件,編寫如下的代碼。創建一個對象obj1,并且創建obj2,指向obj1,然后釋放obj2以及obj1,打印在不同時間點obj1的引用計數。
                                                int main(int argc, const char * argv[]) {
                                                    @autoreleasepool {
                                                        NSObject *obj1 = [[NSObject alloc] init];
                                                        NSLog(@"obj1 當前引用計數:%lu",(unsigned long)[obj1 retainCount]);
                                                        NSObject *obj2 = [obj1 retain];
                                                        NSLog(@"obj1 當前引用計數:%lu",(unsigned long)[obj1 retainCount]);
                                                        [obj2 release];
                                                        NSLog(@"obj1 當前引用計數:%lu",(unsigned long)[obj1 retainCount]);
                                                        [obj1 release];
                                                    }
                                                    return 0;
                                                }
                                                
                                                • 運行結果。我們可以obj1的引用計數的變化過程

                                                ARC(Automatic Reference Counting)

                                                隨著Xcode4.2的發布,蘋果引入了其中一個新特性就是自動引用計數(ARC:Automatic Reference Counting)。與MRC不同,自動引用計數(ARC)模式中,對象的引用計數管理完全交由系統來管理,也就是說,在MRC中的retain/release操作都由系統自動完成了。程序員90%的情況下,不需要去再關系內存管理相關的事務,對象的釋放完全交由系統來統一管理。目前ARC已經成為iOS程序開發的主流選擇,這也是蘋果所希望看到的。使用自動引用計數ARC可以避免程序員因為疏忽而造成的引用計數出錯的隱患,不僅極大的簡化了代碼編寫工作量,同時也減少了內存管理中存在的錯誤。

                                                示例代碼

                                                https://github.com/99ios/6.2


                                                欧美超级精品一级A片|欧美一级黄色视频|国产精品自在在线午夜免费|4444亚洲人成无码网在线观看|亚洲ⅴa曰本va欧美va视频