OC學習筆記 ARC 強指針和弱指針 內存管理


強調一些概念

類:是一種結構,它表示對象的類型,對象引用類來獲取和本身有關的各種信息,特別是運行什么代碼來處理每種操作。

對象:是一種結構,它包含值和指向其類的隱藏指針。

實例:對象的另一種稱呼。

消息:是對象可以執行的操作,用於通知對象去做什么。對象接收消息后,將查詢對應的類,以便查找正確的代碼來運行。

方法:是為響應消息而運行的代碼,根據對象的類,消息可以調用不同的方法。

接口:是對象的類應該提供特殊的特性的描述。

 

oc中訪問成員變量的四種方式

用法如:@property (attribute1,attribute2) float value;

這些attribute包括:

readonly  表示這個屬性是只讀的,就是只生成getter方法,不會生成setter方法。 

readwrite 可讀可寫(默認)設置可訪問級別。

assign:簡單賦值,不更改索引計數

copy:建立一個索引數為1的對象,然后釋放舊對象

retain:釋放(release)舊對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1

nonatomicnonatomic 非原子性訪問,不加同步,多線程並發訪問會提高性能。注意,如果不加此屬性,
則默認是兩個訪問方法都為原子型事務訪問。

前兩個只是簡單的設定變量的可讀寫性。

 

copy其實是建立了一個相同的對象,而retain不是:

比如一個NSString對象,地址為0x1111,內容為@"STR" ,copy到另外一個NSString之后,地址為0x2222,內容相同,新的對象retain為1,舊有對象沒有變化。

舊有對象沒有變化。

retain 到另一個NSString之后,地址相同(建立一個指針,指針拷貝),內容當然相同,這個對象的retain值+1,也就是說,retain是指針拷貝,copy是內容拷貝。在拷貝之前,都會釋放舊的對象。

assign:簡單賦值,不更改索引計數(Reference Counting)。

copy:建立一個索引計數為1的對象,然后釋放舊對象

retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的輸入對象的索引計數為1

 

使用assign:對基礎數據類型(NSInteger)和C數據類型(int ,float,double,char等)

使用copy:對NSString

使用retain:對其他NSObject和其子類。

 

什么是property?

property是一種代碼生成機制,能夠生成不同類型的getter/setter函數,特別是如果你想要用點(.)操作符號來存取變量的話,你就能必須使用property。

 

@class

objective-c中,一種是通過#import方式引入;另一種是通過@class引入;

Person.h-person.m

1 #import <Foundation/Foundation.h>
2 @class Dog;//當一個類使用到另一個類時,並且在類的頭文件中需要創建被引用的指針時。需要在頭文件中引用@class 它類名 如:person類引入dog類對象
3 @interface Person : NSObject
4 @property (nonatomic,strong) Dog *dog;
5 @property (nonatomic,assign) int age;
6 @property (nonatomic,strong) NSString *name;
7 @end
1 #import "Person.h"
2 #import "Dog.h"
3 
4 @implementation Person :NSObject
5 - (void)dealloc
6 {
7     NSLog(@"Person is dealloc");
8 }
9 @end

總結一下

@class是放在interface中的,只是為了在interface中引用這個類,把這個類作為一個類型來用的。 在實現這個接口的實現類中,如果需要引用這個類的實體變量或者方法之類的,還是需要import在@class中聲明的類進來. 

 

@property參數詳解

1>strong :強指針(適用於oc對象類型)

2>weak  :弱指針(適用於oc對象類型)

3>assign:適用於基本數據類型(即非OC對象類型)

 

ARC ( iOS 5推出的新功能,全稱叫 ARC(Automatic Reference Counting)自動引用計數

 ARC的判斷准則:只要沒有強指針指向對象,就會釋放對象

    a)在ARC機制中,所有的retain,release都不能再出現,取而代之的則是strong(強指針)和weak(弱指針)

    b)默認情況下,所有的指針都是強指針類型

    c)只要有強指針指向一個對象,那么系統就不會回收該對象;反之,則立即回收該對象

 

@property中的strong和weak屬性

    a)arc中的strong相當於非arc時的retain

    b)arc中的weak相當於非arc時的assign

    c)arc機制情況下不能再出現 [super dealloc];

    d)基本數據類型依然使用assign修飾,對象一般用strong修飾

    e)當arc機制下對象循環依賴時,這時weak就有用處,結合@class。否則都是strong對方會相互拉着對方,釋放不了內存

 Person.h

1 #import <Foundation/Foundation.h>
2 @class Dog;
3 @interface Person : NSObject
4 @property (nonatomic,strong) Dog *dog;
5 @end

 Dog.h

 

#import "Foundation/Foundation.h"
#import "Person.h"
@class Person;
@interface Dog : NSObject
//當出現類循環應用的時候,只需要把一方面的Strong引用改為weak,並且在.h文件中使用@class 類名的方式,通知.h文件類的存在 @property (nonatomic,weak) Person
*p; @end

OC中ARC機制中還有內存泄漏嗎

基於計數的內存管理是無法處理循環引用的,這和自動不自動沒有關系。
另外不管用什么管理方式都解決不了,其實對象已經沒用了但是忘了撒手”的bug。
比如即便你沒循環引用,但是有一個生存期很長的變量保存着一個根本沒用的對象的引用還是會泄露的。基於xcode arc機制 只要不影響程序性能編程並不關心。

xcode中非arc工程轉換成arc工程

 

以上方法在一些大的項目可能不太使用,因為可能轉換會很耗時,而且系統自動幫忙轉換時避免不了會出錯。

    在實際開發中,若我們用到一些之前第三方的非arc文件,可以使用以下方法讓它們運行在arc工程下

 

-fno-objc-arc

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM