// 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, const char * 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一样。
时间: 2024-12-10 06:47:03