關於objective-c類別方法與實例方法的一些疑問
巴扎黑
巴扎黑 2017-04-24 09:13:06
0
2
488

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

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

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

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

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

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

巴扎黑
巴扎黑

全部回覆(2)
阿神

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

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

按住ctrl點NSString進去看。

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

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板