一、copy與retain:
1、copy其實是建立了乙個相同的物件,而retain不是;
2、copy是內容拷貝,retain是指標拷貝;
3、copy是內容的拷貝,對於像nsstring,的確是這樣,但是如果copy的是乙個nsarray呢?這時只是copy了指向array中相對應元素的指標.這便是所謂的"淺複製".
4、copy的情況:nsstring *newpt = [pt copy];
此時會在堆上重新開闢一段記憶體存放@"abc" 比如0x1122 內容為@"abc 同時會在棧上為newpt分配空間
二、assign與retain:
1、assign: 簡單賦值,不更改索引計數;
2、assign的情況:nsstring *newpt = [pt assing];
此時newpt和pt完全相同位址都是0xaaaa 內容為0x1111 即newpt只是pt的別名,對任何乙個操作就等於對另乙個操作,因此retaincount不需要增加;
3、assign就是直接賦值;
4、retain使用了引用計數,retain引起引用計數加1, release引起引用計數減1,當引用計數為0時,dealloc函式被呼叫,記憶體被**;
5、retain的情況:nsstring *newpt = [pt retain];
此時newpt的位址不再為0xaaaa,可能為0xaabb 但是內容依然為0x1111。
因此newpt 和 pt 都可以管理"abc"所在的記憶體,因此 retaincount需要增加1 ;
三、readonly:
1、屬性是唯讀的,預設的標記是讀寫,如果你指定了唯讀,在@implementation中只需要乙個讀取器。或者如果你使用@synthesize關鍵字,也是有讀取器方法被解析
四、readwrite:
1、說明屬性會被當成讀寫的,這也是預設屬性。設定器和讀取器都需要在@implementation中實現。如果使用@synthesize關鍵字,讀取器和設定器都會被解析;
五、nonatomic:
1、非原子性訪問,對屬性賦值的時候不加鎖,多執行緒併發訪問會提高效能。如果不加此屬性,則預設是兩個訪問方法都為原子型事務訪問;
六、weak and strong property (強引用和弱引用的區別):
1、 weak 和 strong 屬性只有在你開啟arc時才會被要求使用,這時你是不能使用retain release autorelease 操作的,因為arc會自動為你做好這些操作,但是你需要在物件屬性上使用weak 和strong,其中strong就相當於retain屬性,而weak相當於assign。
2、只有一種情況你需要使用weak(預設是strong),就是為了避免retain cycles(就是父類中含有子類,子類中又呼叫了父類,這樣都無法release)
3、宣告為weak的指標,指標指向的位址一旦被釋放,這些指標都將被賦值為nil。這樣的好處能有效的防止野指標。
七、arc(automatic reference counting):
1、就是**中自動加入了retain/release,原先需要手動新增的用來處理記憶體管理的引用計數的**可以自動地由編譯器完成了。
該機能在 ios 5/ mac os x 10.7 開始匯入,利用 xcode4.2 以後可以使用該特性。
八、strong,weak,copy 具體用法:
1.具體一點:iboutlet可以為weak,nsstring為copy,delegate一般為weak,其他的看情況。一般來說,類「內部」的屬性設定為strong,類「外部」的屬性設定為weak。說到底就是乙個歸屬權的問題。小心出現迴圈引用導致記憶體無法釋放。
2.不用arc的話就會看到很多retian。
3.如果你寫了@synthesize abc = _abc;的話,系統自動幫你宣告了乙個_abc的例項變數。
使用assign: 對基礎資料型別
(nsinteger)和c資料型別(int, float, double, char,等)
使用copy:
對nsstring
使用retain:
對其他nsobject和其子類
九、sprintf,strcpy,memcpy使用上有什麼要注意的地方
1、strcpy是乙個字串拷貝的函式,它的函式原型為strcpy(char *dst, c*****t char *src);
2、將src開始的一段字串拷貝到dst開始的記憶體中去,結束的標誌符號為'\0',由於拷貝的長度不是由我們自己控制的,所以這個字串拷貝很容易出錯。具備字串拷貝功能的函式有memcpy,這是乙個記憶體拷貝函式,它的函式原型為memcpy(char *dst, c*****t char* src, unsigned int len);
3、將長度為len的一段記憶體,從src拷貝到dst中去,這個函式的長度可控。但是會有記憶體疊加的問題。
4、sprintf是格式化函式。將一段資料通過特定的格式,格式化到乙個字串緩衝區中去。sprintf格式化的函式的長度不可控,有可能格式化後的字串會超出緩衝區的大小,造成溢位。
iOS 面試題(六)
回答person的retaincount值,並解釋為什麼 person per person alloc init self.person per 1 或者2 看物件用什麼屬性修飾,person類物件在建立的時候引用計數加1,若用 assign類不會使引用計數加1的屬性修飾 person的retai...
iOS 面試題(九)
objective c有私有方法麼?私有變數呢?如多沒有的話,有沒有什麼代替的方法?oc中沒有私有方法,有私有變數 私有方法可以用category 類目 extension 延展 來代替 2 import include和 class有什麼區別 include 用於系統自帶的標頭檔案的引用,編譯器會...
iOS 面試題(十)
如何將產品進行多語言發布?在工程infoplist.strings中新增發布時需要的語言,並在 建立 strings 檔案進行 字串 和其他檔案的多語言處理 2 如何將敏感字變成 訪問敏感字的陣列 nsmutablearray array nsmutablearray alloc init 向敏感字...