1、前言
有些情況下,我們需要對一個類增加這樣一個成員屬性,用來保存一個類,類似這樣;
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface CustomObject : NSObject
/// 保存類
@property (nonatomic, strong) Class classNmae;
@end
NS_ASSUME_NONNULL_END
2、Class屬性內(nèi)存管理策略選用分析
但是我們需要考慮Class成員屬性的存儲策略strong/assign;
strong:使用strong內(nèi)存管理策略,內(nèi)存開辟在堆區(qū),申請和釋放由開發(fā)者管理,有引用計數(shù)的概念;
assign:使用assign內(nèi)存管理策略,內(nèi)存開辟在棧區(qū),申請和釋放由系統(tǒng)自動管理,引用時引用計數(shù)器不會+1;
下邊這兩種策略在程序上效果一樣,都不會報錯、警告,運行正常;
@property (nonatomic, strong) Class classNmae;
@property (nonatomic, assign) Class classNmae;
3、Class在OC中定義
Class在OC中定義
typedef struct objc_class *Class;
objc_class 結(jié)構(gòu)體定義:
struct objc_class : objc_object {
...
}
/// Represents an instance of a class.
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
可以看出類對象同其他類型對象一樣,都有isa指針成員。
4、總結(jié)
類對象在程序啟動時,會自動為我們創(chuàng)建程序定義的每個類的一個類對象。
Class對象在程序中只存在一份,這整個程序運行期間都不會釋放,所以我們不用關(guān)心類對象引用計數(shù)器的變化,對于Class不管使用strong還是assign修飾,在屬性指向區(qū)域的內(nèi)存管理上效果都是一樣。