oc56--ARC多個對象的內存管理
阿新 • • 發佈:2017-08-26
沒有 Owner 管理 bject -a const nbsp int argc
// main.m // ARC中多個對象的內存管理:ARC的內存管理就是MRC的內存管理(一個對象釋放的時候,必然會把它裏面的對象釋放),只不過一個是Xcode加的代碼,一個是我們自己加的代碼; // // ARC單個對象的內存管理:不使用的時候就置為nil,該對象沒有引用就會立即釋放。 // MRC的時候,set一個對象的時候就把這個對象retain一次,當這個對象釋放的時候就把它的對象屬性release一次。 // #import <Foundation/Foundation.h> #import "Person.h" #import "Dog.h" int main(int argc, constchar * argv[]) { Person *p = [[Person alloc] init]; Dog *d = [[Dog alloc] init]; p.dog = d; d.owner = p; //d.owner = [[Person alloc] init]; d = nil; //d = nil才會將d指向的對象裏面的計數器減一,d自動銷毀時計數器是不會減一的。 NSLog(@"-----"); p = nil;//不使用對象的時候就置位nil。這是ARC的,MRC是A對象釋放的時候就把A裏面的B對象也釋放。return 0; }
// Person.h #import <Foundation/Foundation.h> @class Dog; @interface Person : NSObject // MRC, A對象想擁有B對象, 需要對B對象進行一次retain // A對象不用B對象了, 需要對B對象進行一次release // property的時候進行retain, dealloc的時候進行release // ARC, A對象想擁有B對象, 那麽就需要用一個強指針指向B對象 // A對象不用B對象了, 什麽都不需要做, 編譯器會自動幫我們做// 在ARC中保存一個對象用strong, 相當於MRC中的retain @property(nonatomic, strong)Dog *dog; @end
// // Person.m #import "Person.h" @implementation Person - (void)dealloc { NSLog(@"%s", __func__); } @end
// // Dog.h #import <Foundation/Foundation.h> @class Person; @interface Dog : NSObject @property(nonatomic, strong)Person *owner; //@property(nonatomic, assign)Person *owner;// 在ARC中如果保存對象不要用assign, 用weak,assign是專門用於保存基本數據類型的, 如果保存對象用weak //@property(nonatomic, weak)Person *owner; 用於a,b對象的相互引用。 @end
// // Dog.m #import "Dog.h" @implementation Dog - (void)dealloc { NSLog(@"%s", __func__); } @end
ARC中的string,相當於MRC中的retain
ARC中的weak,相當於MRC中的assign
ARC中的assign,用於基本數據類型,跟MRC中的assign一樣。
oc56--ARC多個對象的內存管理