1. 程式人生 > >oc56--ARC多個對象的內存管理

oc56--ARC多個對象的內存管理

沒有 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, 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一樣。

oc56--ARC多個對象的內存管理