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