iOS面試題(三)

1、Objective-C 中創建線程的方法是什么?如果在主線程中執行代碼,方法是什么?如果想延時執行代碼、方法又是什么?

線程創建有三種方法:使用NSThread創建、使用GCD的dispatch、使用子類化的NSOperation,然后將其加入NSOperationQueue;在主線程執行代碼,方法是performSelectorOnMainThread,如果想延時執行代碼可以用performSelector:onThread:withObject:waitUntilDone:

2、為什么我們常見的delegate屬性都用是weak而不是retain/strong?

是為了防止delegate兩端產生不必要的循環引用。
@property (nonatomic, weak) id delegate;

3、什么時候用delete,什么時候用Notification?

Delegate(委托模式):1對1的反向消息通知功能。
Notification(通知模式):只想要把消息發送出去,告知某些狀態的變化。但是并不關心誰想要知道這個。

4、你是否接觸過OC中的反射機制?簡單聊一下概念和使用

1). class反射

  • 通過類名的字符串形式實例化對象。
Class class = NSClassFromString(@"student"); 
Student *stu = [[class alloc] init];
  • 將類名變為字符串
Class class =[Student class];
NSString *className = NSStringFromClass(class);

2). SEL的反射

  • 通過方法的字符串形式實例化方法。
SEL selector = NSSelectorFromString(@"setName");  
[stu performSelector:selector withObject:@"Mike"];
  • 將方法變成字符串
NSStringFromSelector(@selector*(setName:));

5、isa指針問題

isa:是一個Class 類型的指針. 每個實例對象有個isa的指針,他指向對象的類,而Class里也有個isa的指針, 指向meteClass(元類)。元類保存了類方法的列表。當類方法被調 用時,先會從本身查找類方法的實現,如果沒有,元類會向他父類查找該方法。同時注意的是:元類(meteClass)也是類,它也是對象。元類也有isa指針,它的isa指針最終指向的是一個根元類(root meteClass)。根元類的isa指針指向本身,這樣形成了一個封閉的內循環。

6、如何訪問并修改一個類的私有屬性?

1). 一種是通過KVC獲取。
2). 通過runtime訪問并修改私有屬性。

7、一個objc對象的isa的指針指向什么?有什么作用?

指向他的類對象,從而可以找到對象上的方法。

8、怎么用 copy 關鍵字?

用途:

  1. NSString、NSArray、NSDictionary 等等經常使用copy關鍵字,是因為他們有對應的可變類型:NSMutableString、NSMutableArray、NSMutableDictionary;
  2. block 也經常使用 copy 關鍵字。
    說明:
    block 使用 copy 是從 MRC 遺留下來的“傳統”,在 MRC 中,方法內部的 block 是在棧區的,使用 copy 可以把它放到堆區.在 ARC 中寫不寫都行:對于 block 使用 copy 還是 strong 效果是一樣的,但寫上 copy 也無傷大雅,還能時刻提醒我們:編譯器自動對 block 進行了 copy 操作。如果不寫 copy ,該類的調用者有可能會忘記或者根本不知道“編譯器會自動對 block 進行了 copy 操作”,他們有可能會在調用之前自行拷貝屬性值。這種操作多余而低效。

9、用@property聲明的 NSString / NSArray / NSDictionary 經常使用 copy 關鍵字,為什么?如果改用strong關鍵字,可能造成什么問題?

用 @property 聲明 NSString、NSArray、NSDictionary 經常使用 copy 關鍵字,是因為他們有對應的可變類型:NSMutableString、NSMutableArray、NSMutableDictionary,他們之間可能進行賦值操作(就是把可變的賦值給不可變的),為確保對象中的字符串值不會無意間變動,應該在設置新屬性值時拷貝一份。

  1. 因為父類指針可以指向子類對象,使用 copy 的目的是為了讓本對象的屬性不受外界影響,使用 copy 無論給我傳入是一個可變對象還是不可對象,我本身持有的就是一個不可變的副本。
  2. 如果我們使用是 strong ,那么這個屬性就有可能指向一個可變對象,如果這個可變對象在外部被修改了,那么會影響該屬性。
    //總結:使用copy的目的是,防止把可變類型的對象賦值給不可變類型的對象時,可變類型對象的值發送變化會無意間篡改不可變類型對象原來的值。

10、這個寫法會出什么問題:@property (nonatomic, copy) NSMutableArray *arr;

問題:添加,刪除,修改數組內的元素的時候,程序會因為找不到對應的方法而崩潰。
//如:-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x7fcd1bc30460
// copy后返回的是不可變對象(即 arr 是 NSArray 類型,NSArray 類型對象不能調用 NSMutableArray 類型對象的方法)
原因:是因為 copy 就是復制一個不可變 NSArray 的對象,不能對 NSArray 對象進行添加/修改。

答案都是收集而來,如果有什么錯誤,歡迎指正!

轉載于:https://www.cnblogs.com/WinJayQ/p/9108472.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451647.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451647.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451647.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Oracle中修改遇到“ORA-00054: 資源正忙, 但指定以 NOWAIT 方式獲取資源, 或者超時失效”

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Oracle 11g中想修改表名: rename ASSETPORJECT to ASSETPROJECT; 結果提示:ORA-00054: 資源正忙, 但指定以 NOWA…

NWCD

1.java jdk和jre 求和算法 時間復雜度和空間復雜度 restful風格 微服務 maven中央倉庫 項目依賴jar包,換平臺運行 同步和異步 設計模式–代理模式 2.linux 僵尸進程和孤兒進程 如何消除僵尸進程 僵尸進程能被kill調嗎 磁盤性能分析iostat top free fdisk swap中a…

解決設置了background-size: cover; 但是圖片在ios下顯示不完整的問題

設置 background-size: 100% 99.9%; 轉載于:https://www.cnblogs.com/kugeliu/p/9469207.html

Python學習之路20-數據模型

《流暢的Python》筆記。本篇是Python進階篇的開始。本篇主要是對Python特殊方法的概述。1. 前言 數據模型其實是對Python框架的描述,它規范了這門語言自身構件模塊的接口,這些模塊包括但不限于序列、迭代器、函數、類和上下文管理器。不管在哪種框架下寫…

String s1==s2面試題

這個程序運行的結果是什么?class StringTest1{public static void main(String[] args) {String s1"equal";String s2 "equal";if(s1s2){System.out.println("s1s2");}else{ System.out.println("s1!s2");} }} 輸出 s1…

Vector:動態數組的使用和說明

摘自百度百科: 1. Vector 類在 java 中可以實現自動增長的對象數組; 創建了一個向量類的對象后,可以往其中隨意地插入不同的類的對象,既不需顧及類型也不需預先選定向量的容量,并可方便地進行查找。對于預先不知或不愿預先定義數組…

Spring AOP 代理模式

記錄幾篇關于AOP & 代理模式 的博客,寫的非常好,感謝作者分享! Java中的代理模式——靜態代理以及分析靜態代理的缺點 Java中動態代理的兩種方式JDK動態代理和cglib動態代理以及區別 Spring中的AOP以及切入點表達式和各種通知 Spring…

mongodb 多表查詢

今天有一個業務涉及到mongodb的多表查詢,大體記錄下語句結構 db.table_a.aggregate([ {$lookup:{from:"table_b",localField:"userid",foreignField:"userid",as:"organization_doc"}}, //聯表B{ $project:{ _id:1, card…

跨平臺多線程編程

多線程介紹POSIX 1003.1-2001 定義了多線程編程的標準API。這個API就是廣為人知的pthreads。它的目的在于為跨平臺編寫多線程程序提供便利。多線程程序的編寫本文介紹了Linux 和 WIN32 平臺下的多線程程序的編寫方法Linux 系統對 pthreads 提供了良好的支持。一般地安裝完Linux…

方法重載和方法重寫

方法重載 (1) 方法重載是讓類以統一的方式處理不同類型數據的一種手段。多個同名函數同時存在,具有不同的參數個數/類型。 重載Overloading是一個類中多態性的一種表現。 (2) Java的方法重載,就是在類中可以…

shell獲取/etc/passwd中的用戶名和id

核心思想:cut 關鍵詞:head tail cut #!/bin/bash # get the information about /etc/passwd PATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATHfile"/etc/passwd" linewc -l $file | cut -d" "…

進度條控制(Windows 公共進度欄控件的功能)

MSDN:https://msdn.microsoft.com/zh-cn/library/sys15k39.aspx 構造 CProgressCtrl 對象:  CProgressCtrl(); 創建進度欄控件:  virtual BOOL Create( DWORD dwStyle(風格), const RECT& rect(位置大小), CWnd* pParentWnd(父窗體),…

本地瀏覽器緩存sessionStorage(臨時存儲) localStorage(長期存儲)的使用

對瀏覽器來說,使用 Web Storage 存儲鍵值對比存儲 Cookie 方式更直觀,而且容量更大,它包含兩種:localStorage 和 sessionStorage sessionStorage(臨時存儲) :為每一個數據源維持一個存儲區域&am…

HTML5的歷史

HTML5和WHATWG[1] 2004年Opera的IanHickson(現在Google工作)發起的HTML新標簽擴展以適應新的web應用,該發起遭到W3C的拒絕,而W3C憑空杜撰的作風引起了部分人的不滿,來自Opera,Apple,以及Mozilla的代表開始…

B-TREE、B+TREE、數據庫索引

推薦文章: B-Tree詳解 SQL夯實基礎(五):索引的數據結構 MySQL B樹索引和哈希索引的區別 感謝作者分享!

《重構-改善既有代碼的設計》-第1例:租賃影片(1)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 買了《重構 - 改善既有代碼的設計 》一書,一直沒有好好看,大致過了下也覺得只是有點點印象而已,最后…

java類加public和不加public

加public表示全局類,該類可以import到任何類內。不加public默認為保留類,只能被同一個包內的其他類引用。

STL數據結構

STL數據結構 1.priority_queue #include<queue> pritority<int>q;(大根堆) priority_queue<int,vector<int>,greater<int> >q;(小根堆) struct no{ int x,v; bool operator <(const no &T)const{return v>T.v;} // v值xiao的優先 }; q…

《netty實戰》閱讀筆記(2)——Netty 的數據容器ByteBuf

ByteBuffer 當我們進行數據傳輸的時候&#xff0c;往往需要使用到緩沖區&#xff0c;常用的緩沖區就是JDK NIO類庫提供的java.nio.Buffer。 實際上&#xff0c;7種基礎類型&#xff08;Boolean除外&#xff09;都有自己的緩沖區實現&#xff0c;對于NIO編程而言&#xff0c;我們…

JAVA HASHMAP 用法

import java.util.HashMap;public class Student { String name; String sex; public Student(String n,String s) { namen; sexs; } public String toString(){ return ("姓名:"name"\n""性別:"sex"\n…