搜尋

首頁  >  問答  >  主體

關於objective-c類別方法與實例方法的一些疑問

之前都是在搞前端js
之後寫ios開始慢慢接觸objective-c
有個疑問

//实例方法调用
NSString *str1 = [[NSString alloc] initWithString:@"123123"];

//类方法调用
NSString *str2 = [NSString stringWithString@"123123"];

我的疑問可能用上面例子會不太能凸顯出來
疑問在於,
實例方法必須建立一個實例後使用實例進行呼叫
也就是記憶體中必存在一個實例
如果我想不透過實例來達到某些操作
那在設計API時可以設計成類別方法,這樣就可以直接透過類別名稱來呼叫
但是這種情況就不會產生實例在記憶體中了嗎??
或者說,雖然沒有產生實例,但記憶體依然會分配空間
那如果

[XXXClass abc];
[XXXClass bcd];
[XXXClass cde];
[XXXClass def];

這種情況下,記憶體會分配多少塊記憶體空間呢?
而但程式碼域(如方法內)結束後,記憶體空間又是否能正常釋放呢?

巴扎黑巴扎黑2766 天前458

全部回覆(2)我來回復

  • 阿神

    阿神2017-04-24 09:15:06

    你給的例子中,不管是物件方法還是類別方法,它們的目的都是要得到一個物件實例。
    不先分配記憶體空間,拿什麼去配置你的物件呢。
    說不定類別方法裡面是這麼實現的:

    + (instancetype)stringWithString:(NSString *)string {
        NSString *str = [[self alloc]initWithString:string];
        return str;
    }

    回覆
    0
  • PHPz

    PHPz2017-04-24 09:15:06

    按住ctrl點NSString進去看。

    - (instancetype)initWithString:(NSString *)aString;
    + (instancetype)stringWithString:(NSString *)string;
    

    看這兩個方法的前面,一個是「-」一個是「+」
    在oc裡面,如果用加號申明一個方法的話,是不需要實例化就可以呼叫這個類別的方法。
    如果用減號申明一個方法,那麼就需要先alloc實例化一個物件才能對這個類別裡的方法進行呼叫。

    回覆
    0
  • 取消回覆