導航:首頁 > 安裝方法 > ios類方法放在哪裡

ios類方法放在哪裡

發布時間:2023-01-10 11:11:50

Ⅰ iOS 之OC對象的分類

 1)instance對象----實例對象

    instance對象就是通過類alloc出來的對象,每次調用alloc都會產生新的instance對象。

    instance對象中包含了:

        * isa指針

        * 成員變數的值    

2)class對象----類對象

    每個類在內存中只有一個類對象。可通過三種方法獲得:

        1.實例對象調用class方法(Class c1 = [a class])   

        2.類調用class方法(Class c2 = [Animal class])

        3.使用object_getClass方法獲取(Class c3 = object_getClass(a))

    class對象中包含了:

        * isa指針

        * superclass指針

        * 類的屬性信息(@property)

        * 類的對象方法信息(instance method)

        * 類的協議信息(protocol)

        * 類的成員變數信息(ivar)

3)meta-class對象----元類對象

    每個類內存中只有一個元類對象。可通過以下的方法獲取:

     Class metaCls = object_getClass([NSObject class]);

    元類對象和類對象的內存結構是一樣的,但用途不一樣,元類對象中包含了:

        * isa指針

        * superclass指針

        * 類的類方法信息(class method)

從上面的知識我們就可以就看出來:

   1. 成員變數具體的值,放在instance對象(實例對象)里。

    2. 屬性信息、對象方法信息、協議信息、成員變數信息,放在Class對象(類對象)里。

    3. 類方法信息,放在meta-class對象(元類對象)里。

根據信息的存放,我們可以得到 對象方法存儲在class的內存里,類方法存在於meta-class內存里 。

       那麼問題來了,假如現在有一個Animal類的實例化對象a1,如果想用a1調用Animal類的對象方法animalMethod該如何調用呢?畢竟,a1是存儲在實例化對象instance內存中的,而animalMethod方法是存儲於Animal類的內存中的。

       實際上instance實例的對象的isa指針指向class,找到class類以後,再在class類中找存儲於其中的對象方法方法進行調用。

       調用類方法的過程也是如此,class類通過其內部的isa指針找到meta-class類中存儲的類方法,然後再進行調用。

isa、superclass 總結

下面是一張廣為流傳關於isa、superclass的經典圖。

isa

    instance的isa指向class

    class的isa指向meta-class

    meta-class的isa指向基類的meta-class

superclass

    class的superclass指向父類的class

    如果沒有父類,superclass指針為nil

    meta-class的superclass指向父類的meta-class

    基類的meta-class的superclass指向基類的class

instance 調用對象方法的軌跡

    isa找到class,方法不存在,就通過superclass找父類。

class 調用類方法的軌跡

    isa找meta-class方法不存在,就通過superclass找父類。

Ⅱ iOS對象方法和類方法的區別與調用方式

1、類方法是屬於整個類,而不屬於某個對象。2、類方法只能訪問類成員變數,不能訪問實例變數,而實例方法可以訪問類成員變數和實例變數。3、類方法的調用可以通過類名.類方法和對象.類方法,而實例方法只能通過對象.實例方法訪問。4、類方法只能訪問類方法,而實例方法可以訪問類方法和實例方法。5類方法不能被覆蓋,實例方法可以被覆蓋。

Ⅲ iOS中元類和類

元類和類的數據結構是同一個,只是運行時使用的欄位不一樣。

實例方法調用是通過objc_msgSend來調用,它的第一個入參就是實例對象,其流程是查找實例對象的isa指針,找到類對象,然後找到method_t的IMP,bl直接跳轉調用。

類方法的調用和實例方法調用一致,它的第一個入參對象是類對象,類對象的isa指向的是元類。

所以,沒有元類的話,類方法是沒有辦法調用的。objc_msgSend的調用流程是一定要isa指針的。

如果實例方法和類方法都放在類對象上,那類對象的isa指針只能指向自己了,那一旦類方法和實例方法重名,就沒法搞了!

Ⅳ iOS分類中調用主類原實例、類方法

看到裡面有一個 struct objc_method_list ** methodLists ,這就是存儲該類所有方法的地方了。查找方法的時候並不是每次都去遍歷methodList的,而是先去cache中查,cache中存儲了最近常用的方法。

看一下objc_method_list這個結構體

它有一個指向存儲廢棄方法列表的指針struct objc_method_list *obsolete,還有方法的個數int method_count,還有一個用於存儲方法的數組struct objc_method method_list[1]。其中數組的長度是可變的。

看一下objc_method這個結構體,

SEL method_name表示方法名,char *method_types表示參數及返回值類型,IMP method_imp表示指向方法實現的指針。

導入:

協議方法的獲取

類屬性的獲取

實例方法的獲取

類方法的獲取

方法交換 method swizzled

Ⅳ ios 怎麼在類方法中 調用類方法

類方法和實例方法 實例方法是— 類開頭是+ 實例方法是用實例對象訪問,類方法的對象是類而不是實例,通常創建對象或者工具類。 在實例方法里,根據繼承原理發送消息給self和super其實都是發送給self 在類方法裡面self是其他的類的類方法

Ⅵ 第五篇:IOS類探究(成員變數值放在哪裡,成員變數信息放在哪裡)

我們簡單寫個demo,在我們定義的類HPWPerson里放了name,age屬性,還有_hobby成員變數

首先我們考慮兩個問題,類方法是放在哪裡?成員變數是放在哪裡?帶著這兩個問題我們進行深入的探究下。

我們通過上篇結尾的分析其實知道,實例方法,成員屬性,協議等都是存放在class_rw_t這個結構體里,如下面源碼所示,

我們繼續在class_rw_t結構體源碼里找下,發現有class_ro_t這個結構體,這個結構體是干什麼的呢?

我們通過列印得到如下:

@property (nonatomic ,) NSString *name;這個會生成下劃線的成員變數_name,
@property (nonatomic ,assign) int age;這個會生成下劃線的成員變數_age,
發現我們再列印class_ro_t里發現有上圖所示的成員變數,所以其中「_hobby」,「_age」,"_name"這些是存在class_ro_t這個結構里的。

通過上面我們發現,成員變數的值是放在對象里,成名變數名字以及一些大小信息放在類裡面,這個是為什麼呢?其實類裡面的結構體它就好比一個模板,通過這個模板就可以生成各個成員變數信息,但是成員變數的值是不同的所以成員變數的值要存放在實例對象里,成員變數名及大小信息放在類裡面就可以。

接著我們再繼續探究下,在class_rw_t這個結構體里有class_ro_t這個結構體,那這兩個結構體有什麼關系呢?

1.class_ro_t是在編譯的時候生成的(只讀),是一個純凈的空間,不能被修改的

我們知道蘋果的runtime可以動態的修改屬性和方法,但是ro里又不支持修改的,那它是如何實現的呢?
我們先看下WWDC里的一個視頻講解:
WWDC講解ro,rw鏈接

通過上面的視頻我們知道,ro在編譯的時候生成,在內存不夠的時候就會進行移除,當要使用的時候就會重新從磁碟里去載入。在objc源碼里我們發現有個叫class_rw_ext_t的結構體,簡稱為rwe。class_rw_ext_t這個也不是每個類里都生成的,因為生成class_rw_ext_t是有條件的:或者有分類,或者runtime API修改的時候會生成這個rwe結構體。runtime是無法修改成員變數的,rwe在對ro里進行拷貝出的也是其中一部分,一般ro里也就10%的內容需要修改。接著我們看rwe源碼如下,也驗證了我們這點:如果有rwe就直接返回裡面的methods,沒有就返回ro里的baseMethods。

屬性存放在rw里源碼:如果有rwe就直接返回裡面的properties,沒有就返回ro里的baseProperties。

協議存放在rw里源碼:如果有rwe就直接返回裡面的protocols,沒有就返回ro里的baseProtocols。

設計元類只是單獨為了存放我們的類方法嗎?

其實其目的是為了復用消息機制。在OC中調⽤⽅法,其實是在給某個對象發送某條消息。
消息的發送在編譯的時候編譯器就會把⽅法轉換為objc_msgSend這個函數。
id objc_msgSend(id self, SEL op, ...) 這個函數有倆個隱式的參數:消息的接收者,消息的⽅法
名。通過這倆個參數就能去找到對應⽅法的實現。
objc_msgSend函數就會通過第⼀個參數消息的接收者的isa指針,找到對應的類,如果我們是通過
實例對象調⽤⽅法,那麼這個isa指針就會找到實例對象的類對象,如果是類對象,就會找到類對
象的元類對象,然後再通過SEL⽅法名找到對應的imp,然後就能找到⽅法對應的實現。
那如果沒有元類的話,那這個objc_msgSend⽅法還得多加倆個參數,⼀個參數⽤來判斷這個⽅法
到底是類⽅法還是實例⽅法。⼀個參數⽤來判斷消息的接受者到底是類對象還是實例對象。
消息的發送,越快越好。那如果沒有元類,在objc_msgSend內部就會有有很多的判斷,就會影響
消息的發送效率。
所以元類的出現就解決了這個問題,讓各類各司其職,實例對象就⼲存儲屬性值的事,類對象存儲
實例⽅法列表,元類對象存儲類⽅法列表,符合設計原則中的單⼀職責,⽽且忽略了對對象類型的
判斷和⽅法類型的判斷可以⼤⼤的提升消息發送的效率,並且在不同種類的⽅法⾛的都是同⼀套流
程,在之後的維護上也⼤⼤節約了成本。
所以這個元類的出現,最⼤的好處就是能夠復⽤消息傳遞這套機制。不管你是什麼類型的⽅法,都
是同⼀套流程。

接著我們如何證明我們上面所說的呢?下面我們來看下在源碼里設置斷點調試:

首先我們打開objc的源碼,

我們一直按上面去列印,最後會列印一個classMethod這個類方法,在我們設置HPWPerson這個類里也有這個方法,如下,所以證明了類方法是存放在元類裡面的。

接著我們看些runtime的api方法的實現:

上面這些我們是用runtime的api把成員變數,實例方法,類方法等列印出來。
通過上面總結:
1)ro里存放成員變數,實例方法,屬性,協議,類對象
2)類方法存放在元類裡面

Ⅶ ios 怎麼調用分類裡面的方法

ios category類別的使用
Objective-C提供了一個非常靈活的類(Class)擴展機制-類別(Category)。類別用於對一個已經存在的類添加方法(Methods)。你只需要知道這個類的公開介面,不需要知道類的源代碼。需要注意的是,類別不能為已存在的類添加實例變數(Instance Variables)。

類別的基本語法如下:
@interface ClassName(CategoryName)
//method declarations
@end
@interface 類名(類別名)
類別方法申明
@end
注意幾點:
1.現有類的類名位於 @interface之後
2.括弧中是類別的名稱(只要名稱唯一,可以添加任意多的類別)
3.類別沒有實例變數部分
類別的語法與類的語法非常相似。類別的方法就是類的方法。類別的定義可以放在一個單獨的文件中("類別名.h"), 也可以放在一個已存在的類的定義文件中(.h文件)。類別的實現則可放在一個單獨的「類別名.m」文件中,或另一個類的實現文件中。這點也與類的定義相似。因為類別的方法就是類的方法,所以類別的方法可以自由引用類的實例變數(無論公有或私有)。

子類(subclassing)是進行類擴展的另一種常用方法。與子類相比,類別最主要的優點是:系統中已經存在的類可以不需修改就可使用類別的擴展功能。例如,假設系統中存在一個類A;另外一個類B中定義了一個類A類型的實例變數,並包含了類A的頭文件「#import <A.h>"。假設一段時間後,需要對類A擴展幾個新的方法。如果用子類,就需要創建一個子類A-1。如果類B想要使用類A的新方法,就要進行如下修改:1) 將包含的頭文件改為"#import<A-1.h>"; 2)將所有用到的類A對象改為類A-1的對象。可以想像,如何有很多類需要用到類A的新功能(比如類A是iOS中的類UIViewController),隨著系統的升級(iOS從1.0到5.0),你的程序需要不停地進行這種繁瑣地修改。如果使用類別,即使類A升級了,系統中其它的類可以不需任何修改,直接就可以調用類A的新方法。

類別的第二大優點是實現了功能的局部化封裝。類別定義可以放在一個已存在的類(類A)的定義文件中(.h)。這意味著這個類別只有在類A被引用的前提下才會被外部看到。如果另一個類(類B)不需要用到類A的功能(沒有包含類A的.h文件),也就不會看到依附類A存在的類別。iOS SDK中廣泛運用這種類別定義法來封裝功能。例如,在 UINavigationController.h中定義了專為UINavigationController擴展的UIViewController類別:

@interface UIViewController (UINavigationControllerItem)
@property(nonatomic,readonly,retain) UINavigationItem *navigationItem;
@property(nonatomic,readonly,retain) UINavigationController *navigationController;
......
@end
如果一個類不引用UINavigationController.h,也就不會看到navigationItem和navigationController這兩個性質申明(declared property)。

類別的另一個優點是輕巧(light-weight)。很多時候,對已存在的類所需的擴展僅僅是幾個新方法。這時,用類別避免了在系統中留下很多非常短小的「微」子類,使程序更加緊湊。

歸納:
1、實現類別
同實現類相似,實現方法即可
2、 類別的局限性
1.類別不能添加新的實例變數
2.命名沖突,如果類別中方法和類中已有方法同名,則類別具有更高優先順序
3 類別的作用
1.將類的實現分散到多個不同文件或多個不同框架中
2.創建私有方法的前向引用
3.向對象添加非正式協議
4 利用類別分散實現
利用類別可以將類的方法分散到多個源文件中
特別指出的是:類別可以訪問其繼承的類的實例變數
在使用一個方法時,對象的方法是在介面中聲明、父類中聲明、還是類別中聲明並不重要
類別不僅可以分散實現到不同源文件,也可跨框架
5、 使用類別創建前向引用
雖然可以實現未聲明的方法,但是編譯器會提出警告
通過類別可以提供聲明,而且,聲明的方法不必要一定在類別的實現中實現,也可以在類的實現中實現
6、 非正式協議和委託類別
委託(delegage)是一種對象,另一個類的對象會要求委託對象執行它的某些操作
委託對象接受其它對象對它的特定方法的調用
其實就是委託對象必須實現別的對象調用的方法,與介面類似
7、 ITunesFinder項目
8 、委託和類別
委託和類別有什麼關系?委託強調類別的另一種應用:被發送給委託對象的方法可以聲明為一個NSObject的類別
創建一個NSObject的類別稱為「創建一個非正式協議」
9、 響應選擇器
選擇器只是一個方法名稱,可以使用@selector()預編譯指令指定選擇器,其中方法名位於圓括弧中,但它以OC運行時使用的特殊方式編碼,以快速執行查詢
NSObject提供了一個respondsToSelector的方法,詢問對象以確定其是否實現某個特定消息
10、 選擇器的其他應用
選擇器可以被傳遞,可以作為方法參數,甚至可以作為實例變數存儲

Ⅷ iOS中 類方法和實例方法及self和super

1、類方法 :Class Method 有時被稱為靜態方法,類方法可以獨立於實例對象而執行。在使用類方法時要注意以下幾點:

2、實例方法: 必須由類的實例對象調用,可以訪問屬性,實例變數,同樣可以訪問類對象,使用限制相對於類方法較少。

總的來說: self 會優先調用本類中的方法, super 會優先調用父類方法。但是, self 是指向本類的指針,是類的隱藏參數,指向當前調用方法的對象(類對象或者實例對象), super 卻不是指向父類的指針,只是一個編譯器標識符,其在運行時中與self相同,指向 同一個消息接受者 ,只是 self 會優先在當前類的methodLists中查找方法,而 super 則是優先從父類中查找, 向super發送消息是一種調用繼承鏈上的超類定義的 方法實現 的方法。

結果分析:

經過上面的例子再回來看self和super的實現原理可能更加好理解:

這樣結合上述例子和self和super的原理就會很容易明白為什麼 [self class] 和 [super class] 輸出結果會是一樣的,同時在 BaseViewController 的 viewDidLoad 中 [self class] 和 [super class] 輸出都是子類類對象了

iOS中關於類方法和實例方法及self和super

Ⅸ ios怎樣調用類方法

類方法也叫工廠方法,一般用加號「+」修飾
不需要創建對象就直接可以使用,直接使用類名久可以調用,例如:[NSString stringWithFormat:@"%@",@"123"];

閱讀全文

與ios類方法放在哪裡相關的資料

熱點內容
鍛煉基本功的方法 瀏覽:490
頭風的治療方法 瀏覽:363
啤酒的食用方法和用量 瀏覽:568
anica迷你手機設置日期方法 瀏覽:409
銅線和鋁線連接正確方法家用 瀏覽:118
德育如何掌握人際交往的方法 瀏覽:899
白兔的探視用說明方法怎麼描寫 瀏覽:111
中深孔采礦是什麼采礦方法 瀏覽:229
oppo顯示電量百分比在哪裡設置方法 瀏覽:927
電話銷售如何開發新客戶的方法 瀏覽:543
默認簡訊在哪裡設置方法 瀏覽:645
治療腳跟骨刺的好方法 瀏覽:914
風管漏風檢測方法 瀏覽:253
東風菱智車頂棉安裝方法 瀏覽:571
什麼方法能讓嬰兒去痰 瀏覽:258
羽毛球的使用方法 瀏覽:581
接球技術包括哪些技術方法 瀏覽:79
臉頰周圍長痘解決方法 瀏覽:73
水電瓶充電視頻教學方法 瀏覽:524
丙肝修復最佳方法 瀏覽:816