iOS面試題三

2021-07-10 10:19:50 字數 2502 閱讀 9072

一、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 向敏感字...