【2015-10-19】內存管理---深淺拷貝,autorelease,ARC(自動引用計數)

一.複習內存管理中的MRC(手動管理內存)學習

1.仍是遵循誰retain,誰release的原則;atom

2.遛狗練習的中途換狗問題,在person的.m文件中重寫setdog方法spa

- (void) setDog:(Dog *)dog{.net

    //DogA 計數器 - 13d

    [_dog release];指針

    //當前溜的DogBcode

    _dog = dog;orm

    //DogB 計數器 + 1對象

    [_dog retain];內存

}

3.關於retainCount爲1,-1,0,無窮大的條件

(1)爲1時 是對象計數 當建立對象時或者對象即將釋放時爲1,即對象計數器最小爲1.

(2)爲0時 當一個指針的值爲空時。

(3)爲-1或無窮大時 當一個數據類型被賦值時。

不可變對象一般被稱爲靜態常量,這類對象通常不能用於計數,而可變的對象是能夠用來計數的

二.學習了淺拷貝和深拷貝

1.淺拷貝 copy 一般指針對於指針進行拷貝,特色爲:經過多個指針指向同一片內存地址。

如  NSString *string = @"123";

    NSString *stringI = [string copy];

這時string和stringI輸出的內存地址相同

2.深拷貝 mutableCopy 指的是賦值內容而且從新建立一塊內存地址

如  NSString *stringII = [string mutableCopy];

這時string和stringII輸出的內存地址不相同

三.自動釋放池(autorelease)

1.autorelease一般有做用域,當在做用域範圍內的建立特定的對象時,出去做用域計數器就會-1

如 @autorelease{

    Person *personP = [[Person alloc]autorelease];

//特定的autorelease建立的對象纔在出去做用域的時候release 計數器 -1

此時也能夠在做用域裏面對person retain或release,可是無論怎樣,出做用域時計數器只會減y一

}

四.ARC(自動引用計數)

1.ARC會追蹤你的對象並決定哪個仍會使用而哪個不 會再用到  

• 若是啓用了ARC,編譯器會自動插入retain和release 語句  

• 經過Xcode啓用或禁用可

2.ARC的特色

(1)不容許調用release,retain,retainCount    

(2)容許重寫dealloc,可是不容許調用[super dealloc]  

(3)@property的參數:  

  • strong:至關於原來的retain(適用於OC對象),成員變量是強指針  

  • weak:至關於原來的assign,(適用於OC對象類型),成員變量是弱指針  

  • assign:適用於非OC對象類型(基礎類型)

相互引用時注意的問題:

1.在一方的.h文件中要導入另外一方的頭文件,另外一方的.h文件要引用@class name

如  #import <Foundation/Foundation.h>

   #import "MicroBlog.h"

   @interface Person : NSObject

   #import <Foundation/Foundation.h>

   @class Person;

   @interface MicroBlog : NSObject

2.一方使用強指針,另外一方使用弱指針

3.引用@class的一方若要在.m文件中實現相應的方法,要在.m文件中再次導入另外一方的頭文件

如  #import "MicroBlog.h"

   #import "Person.h"

   @implementation MicroBlog


ARC實例:

person.h

#import <Foundation/Foundation.h>

#import "MicroBlog.h"


@interface Person : NSObject

@property (nonatomic ,strong)MicroBlog *microBlog;

@property (nonatomic,strong) NSString *name;

@property (nonatomic,weak) NSString *comment;

-(void)printf;

@end


person.m

#import "Person.h"


@implementation Person

-(void)printf

{

    NSLog(@"%@%@發佈了第%i條微博,內容是:%@",_name, [_microBlog time],[_microBlog second],[_microBlog content]);

}

@end


microBlog.h


#import <Foundation/Foundation.h>

@class Person;


@interface MicroBlog : NSObject

@property(nonatomic,weak) Person *person;

@property(nonatomic,weak) Person *commentPerson;

@property(nonatomic,weak) NSString *content;

@property(nonatomic,weak) NSString *time;

@property(nonatomic,assign) int second;


-(void)printComment;

@end


microBlog.m

#import "MicroBlog.h"

#import "Person.h"


@implementation MicroBlog

-(void)printComment

{

    NSLog(@"%@評論了你的微博:%@",[_commentPerson name],[_commentPerson comment]);

}

@end


main.m

#import <Foundation/Foundation.h>

#import "MicroBlog.h"

#import "Person.h"


int main(int argc, const char * argv[]) {

    

    Person *person = [[Person alloc]init];

    person.name = @"小明";

    Person *personI = [[Person alloc]init];

    personI.name = @"小花";

    personI.comment = @"👍";

    

    MicroBlog *microBlog = [[MicroBlog alloc]init];

    

    microBlog.content = @"暑假去旅遊";

    

    microBlog.second = 2;

    

    NSDate *date = [NSDate date];

    NSDateFormatter *dateformatter = [[NSDateFormatter alloc]init];

    [dateformatter setDateFormat:@"yyyy-MM-dd HH-mm-ss"];

    NSString *nowTime = [dateformatter stringFromDate:date];

    microBlog.time = nowTime;

    

    microBlog.commentPerson = personI;


   //這是容易忘記的一步,要給person對象設置microBlog

    person.microBlog = microBlog;

    

    [person printf];

    [microBlog printComment];

    

 return 0;

}

相關文章
相關標籤/搜索