???
按管理方式看:oc對象存放于堆里面(堆內(nèi)存需要程序員手動回收)
非oc對象一般放在棧里面(棧內(nèi)存會被系統(tǒng)自動回收)
按分配方式分:堆是動態(tài)和回收內(nèi)存的,沒有靜態(tài)分配的堆。
棧有靜態(tài)分配和動態(tài)分配兩種,靜態(tài)分配由系統(tǒng)編譯器完成,比如局部變量分配。動態(tài)分配是有alloc函數(shù)進行分配,它的動態(tài)分配也是由系統(tǒng)編譯器進行釋放,不需要程序員手動管理。
擴展:oc中nsstring的內(nèi)存存儲方式:
NSString* name = @"zhangsan"去定義,屬于常量類型,程序會把這部分數(shù)據(jù)放到全局變量存儲區(qū),你不用釋放,你也釋放不掉,不信你可以release以后再查看它的retainCount;
[[NSString alloc] ] initWithFormat:@"%@ %@",firstname,secondname];這種類型的需要釋放,因為alloc過了,程序需要手動用release釋放,你寫的那種方法不正確,沒有直接init的。
[NSString stringWithFormat:@"%@ %@",firstname,secondname];這種類型生成的NSString是autorelease類型的變量,不需要釋放,程序一次runLoop結(jié)束后就會釋放。你不能用release釋放。
初始化字符串的時候,直接賦值 @"abc",stringWithString ,alloc? initWithString這三種方法中,@"abc"? 存放在常量池。重復(fù)賦值,不會重新分配內(nèi)存空間。
注意:常量區(qū)的引用計數(shù)是lu的最大值。
stringWithFormat? alloc? initWithFormat ,存放的地址為堆區(qū)。? ? NSString 不需要我們進行內(nèi)存管理,F(xiàn)oundation框架會自動幫我們管理。