之前都是在搞前端js
之後寫ios開始慢慢接觸objective-c
有個疑問
//实例方法调用
NSString *str1 = [[NSString alloc] initWithString:@"123123"];
//类方法调用
NSString *str2 = [NSString stringWithString@"123123"];
我的疑問可能用上面例子會不太能凸顯出來
疑問在於,
實例方法必須建立一個實例後使用實例進行呼叫
也就是記憶體中必存在一個實例
如果我想不透過實例來達到某些操作
那在設計API時可以設計成類別方法,這樣就可以直接透過類別名稱來呼叫
但是這種情況就不會產生實例在記憶體中了嗎??
或者說,雖然沒有產生實例,但記憶體依然會分配空間
那如果
[XXXClass abc];
[XXXClass bcd];
[XXXClass cde];
[XXXClass def];
這種情況下,記憶體會分配多少塊記憶體空間呢?
而但程式碼域(如方法內)結束後,記憶體空間又是否能正常釋放呢?
阿神2017-04-24 09:15:06
你給的例子中,不管是物件方法還是類別方法,它們的目的都是要得到一個物件實例。
不先分配記憶體空間,拿什麼去配置你的物件呢。
說不定類別方法裡面是這麼實現的:
+ (instancetype)stringWithString:(NSString *)string {
NSString *str = [[self alloc]initWithString:string];
return str;
}
PHPz2017-04-24 09:15:06
按住ctrl點NSString進去看。
- (instancetype)initWithString:(NSString *)aString;
+ (instancetype)stringWithString:(NSString *)string;
看這兩個方法的前面,一個是「-」一個是「+」
在oc裡面,如果用加號申明一個方法的話,是不需要實例化就可以呼叫這個類別的方法。
如果用減號申明一個方法,那麼就需要先alloc實例化一個物件才能對這個類別裡的方法進行呼叫。