ios面試八股文

??Swift 語言特性??:請解釋一下?struct和?class的主要區別。

特性??

??struct (值類型)??

??class (引用類型)??

??類型本質??

值類型 (復制時創建獨立副本)

引用類型 (復制時共享同一實例)

??內存分配??

通常在棧上 (更快速)

在堆上 (需要ARC管理)

??可變性??

默認不可變 (需?mutating修飾方法)

默認可變

??繼承??

不支持繼承

支持單繼承

??析構器??

無?deinit

有?deinit用于資源清理

??線程安全??

天然線程安全 (獨立副本)

需手動同步 (多線程訪問同一實例可能沖突)

??引用計數??

依賴ARC管理內存

??

內存管理??:談談你對 ARC(自動引用計數)的理解。什么是強引用循環?如何避免?

Swift 在編譯時自動插入?retain(增加引用計數)和?release(減少引用計數)指令,通過??跟蹤對象的引用關系??自動管理內存生命周期。

解釋?weak和?unowned的底層區別??:

weak通過額外??側表(Side Table)?? 實現自動置?nilunowned直接訪問原始指針。.

??生命周期??:描述一下?UIViewController的視圖生命周期(例如?viewDidLoad,?viewWillAppear,?viewDidLayoutSubviews等)。在哪個方法里更新視圖的布局或幀是安全的?

loadView() 創建視圖層次的根視圖

viewDidLoad()視圖首次加載到內存

??viewWillAppear(_:)視圖即將出現

viewDidAppear(_:)視圖完成顯示

viewWillDisappear(_:)視圖即將離開屏幕

viewDidDisappear(_:)視圖已經離開屏幕

??viewWillLayoutSubviews()視圖??即將計算子視圖布局

??viewDidLayoutSubviews()視圖??已完成子視圖布局計算??(frame已確定)

我們在viewDidLayoutSubviews()中更新視圖布局或者幀是最安全的

??多線程??:DispatchQueue.main.async和?DispatchQueue.global().async分別有什么作用?為什么更新UI必須在主隊列進行?

DispatchQueue.main.async:從非主線程切換到主線程,確保UI操作在主線程執行

?DispatchQueue.global().async的作用:全局隊列,是一個并發隊列

UIKit 和 CoreAnimation 的底層代碼??未加鎖??(鎖會降低性能),同一時間只允許??主線程??修改 UI 元素。

Objective-C 中CategoryExtension的區別是什么?Category 能否添加成員變量?如果不能,如何間接實現 “添加屬性” 的效果?(考察 runtime 關聯對象的理解)

category分類

用于給已經存在的類添加新方法,不能添加新的成員變量,可以有單獨的文件,經常用于講將一個龐大的類拆分為多個模塊

類擴展

本質上是類的匿名分類,只能定義在類的實現文件中,可以添加私有成員變量,方法和屬性

Category不能添加成員變量,因為oc的類在編譯的時候就會確定內存布局,故無法添加

可以使用runtime關聯對象實現,原理是將一個對象和另一個對象關聯起來,可以達到添加屬性的效果

關聯對象本質上是通過 Runtime 函數,將一個對象(值)與另一個對象(宿主)建立關聯關系,并通過唯一的 key 來標識這種關聯。這種關聯關系會被系統管理,當宿主對象被銷毀時,關聯對象也可以被自動清理。

Swift 的Optional(可選類型)是如何解決空指針問題的?請解釋?!guard letif let的用法差異,以及nil coalescing??)運算符的底層邏輯。

其本質上是一個枚舉類型

enum Optional<T> {case none       // 表示空值(nil)case some(T)    // 表示有值,關聯值為具體數據
}

使用?聲明一個可選類型,表示該變量肯為nil

!強制解包,將可選類型強制轉換為非可選類型

if let 安全解包方式,判斷可選值是否為nil,若有值,將值綁定到新變量并執行代碼塊,若為nil則跳過代碼塊

guard let 可選綁定-提前退出

??用于為可選值提供默認值

Objective-C 中strongweakassigncopy四種屬性修飾符的區別是什么?

修飾符內存管理策略適用場景核心特點
strong強引用,會增加對象的引用計數(retain),持有對象直至自身被釋放。大多數對象類型(如自定義類實例)確保對象不會被意外釋放,是默認的對象修飾符。
weak弱引用,不增加引用計數,當對象被釋放后,指針會自動置為?nil(避免野指針)。避免循環引用的場景(如代理?delegate不持有對象,對象銷毀后自動清空指針,防止訪問已釋放內存導致崩潰。
assign直接賦值,不涉及引用計數,適用于基本數據類型。非對象類型(如?intfloatCGFloat?等)用于基本數據類型,若用于對象類型,對象釋放后指針不會清空,可能導致野指針。
copy創建對象的副本并持有副本(copy?操作),不關心原對象的生命周期。不可變對象(如?NSStringNSArray?等)確保屬性持有獨立的副本,避免受原對象修改的影響。

Swift 中的inout參數和 Objective-C 的指針參數有什么異同

兩者的核心目的一致:允許函數修改外部傳入的變量,打破了函數參數默認的 "值傳遞" 限制。

Objective-C 指針參數:通過傳遞變量的內存地址(指針),函數可直接修改指針指向的內存數據。

Swift?inout?參數:通過特殊的傳遞機制,使函數能夠修改外部變量的值。基于 "復制 - 修改 - 寫回"(Copy-In-Copy-Out)機制,并非直接操作內存地址

Objective-C 的@dynamic和 Swift 的dynamic關鍵字作用有何不同?(考察對動態特性的理解)

oc中的@dynamic與synthesize均用于處理屬性的存取方法,但是行為完全相反

synthesize為默認行為,告訴編譯器自動生成屬性的存取方法,如果未顯示聲明,那么編譯器會默認為屬性生成synthesize property = _property

@dynamic告訴編譯器不要自動生成存取方法和實例變量,由開發者來提供

在swift中

KVO(鍵值觀察):Swift 的屬性默認不支持 KVO,標記?dynamic?后才能被觀察

隱含?@objc?的效果(自動暴露給 Runtime),且強制開啟動態分發,確保成員能被 Runtime 動態修改(如方法交換)。

Swift 的Extension能否添加存儲屬性?如果不能,如何實現類似 “添加存儲屬性” 的效果?**(考察對 Swift 類型系統的理解)

擴展是不改變原有類型結構的前提下為其添加功能

擴展的核心作用是 “擴展功能” 而非 “修改結構

通過 Objective-C Runtime 的關聯對象機制,為類(Class)添加 “偽存儲屬性”

?Objective-C 中NSObjectisKindOfClass:isMemberOfClass:有什么區別?在 Swift 中如何實現類似判斷?(考察對類繼承與元類的理解)

在 Objective-C 中,一切對象(包括類本身)都是?NSObject?的實例,存在兩條關鍵的繼承鏈

實例對象的繼承鏈:實例對象 → 類對象(如?[Person class])→ 父類對象(如?[NSObject class])→?nil

類對象繼承鏈:類對象 → 元類對象(Meta Class,類的 “類”)→ 父元類對象 → 根元類(Root Meta Class)→ 根類(NSObject)→?nil

調用?[obj isKindOfClass:cls]?時,會檢查?obj?的整個繼承鏈(包括自身所屬類及所有父類)。

調用?[obj isMemberOfClass:cls]?時,僅檢查?obj?直接所屬的類(不包含父類)。

Swift 中protocolmutating關鍵字有什么作用?

mutating?關鍵字用于修飾協議中的方法,表明該方法?允許修改遵循協議的結構體(struct)或枚舉(enum)的實例本身

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

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

相關文章

IntelliJ IDEA 2023更新git憑據

背景&#xff1a;已知原來從遠程倉庫獲取的項目&#xff0c;需要更新git用戶和密碼&#xff0c;但是又不想刪除本地項目環境&#xff08;不想重新獲取新建項目&#xff09;。報錯&#xff1a;remote: HTTP Basic: Access denied. The provided password or token is incorrect …

Docker 容器 OOM:從資源監控到JVM調優的實戰記錄

人們眼中的天才之所以卓越非凡&#xff0c;并非天資超人一等而是付出了持續不斷的努力。1萬小時的錘煉是任何人從平凡變成超凡的必要條件。———— 馬爾科姆格拉德威爾 &#x1f31f; Hello&#xff0c;我是Xxtaoaooo&#xff01; &#x1f308; “代碼是邏輯的詩篇&#xff…

【開題答辯全過程】以 基于微信小程序的寵物領養系統為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

【可信數據空間-連接器狀態監控-Java代碼集成】

可信數據空間-連接器狀態監控-Java代碼集成一、 核心概念1. Micrometer2. Micrometer Registry Prometheus3.Prometheus二、 依賴配置 (Maven)三、 集成步驟與代碼示例場景一&#xff1a;在 Spring Boot 應用中集成&#xff08;最簡單&#xff09;1. 添加依賴&#xff08;如上所…

反編譯分析C#閉包

一、問題描述&#xff1a;比如有這樣的代碼&#xff1a;它的輸出結果是 3&#xff0c;3&#xff0c;3。通過搜索得知這一現象是因為C#閉包導致的.我們借助ILSpy看下IL中間代碼&#xff0c;首先它生成了一個名叫DisplayClass的類&#xff0c;類中定義了i的字段主代碼&#xff1a…

卷積神經網絡(CNN):從圖像識別原理到實戰應用的深度解析

目錄一.CNN的技術必要性&#xff1a;破解傳統圖像處理的兩大核心痛點痛點1&#xff1a;特征依賴人工設計&#xff0c;通用性差痛點2&#xff1a;全連接網絡參數爆炸&#xff0c;訓練難收斂二.CNN的核心原理&#xff1a;兩大機制與分層感知邏輯1.核心機制1&#xff1a;局部連接&…

用 SPL 編寫阿里云 FC2.0 函數

前言 在數字化轉型持續加速的背景下&#xff0c;企業越來越多地將業務邏輯以服務化方式部署至云端。阿里云函數計算&#xff08;Function Compute&#xff0c;簡稱FC&#xff09;作為一種無服務器計算平臺&#xff0c;屏蔽了底層資源運維的復雜性&#xff0c;使開發者能夠專注…

AR 巡檢與普通巡檢有哪些區別,有哪些優勢|阿法龍XR云平臺

AR 巡檢&#xff08;增強現實巡檢&#xff09;與普通巡檢&#xff08;傳統人工巡檢&#xff09;在技術應用、效率、準確性等多個維度存在顯著差異&#xff0c;具體區別如下&#xff1a; 1. 巡檢方式更智能 普通巡檢&#xff1a;依賴人工現場觀察&#xff0c;主要通過眼看、手…

Java中的volatile關鍵字詳解

核心作用&#xff1a;解決可見性和有序性問題volatile 的主要作用可以歸結為兩點&#xff1a;1.保證變量的可見性 和 禁止指令重排序。2.它提供了一種輕量級的同步機制&#xff0c;3.但需要注意的是&#xff0c;它不能保證原子性。保證可見性&#xff1a;什么是可見性問題&…

【Linux】MySQL數據目錄遷移步驟(含流程圖踩坑經驗)

在生產環境中&#xff0c;有時候你會遇到一些看似簡單但實際上很棘手的問題。最近我就碰到了一次典型的服務器磁盤空間告急&#xff0c;最后通過遷移 MySQL 數據目錄成功解決了問題。本文記錄整個過程&#xff0c;包括我的分析思路、遷移步驟、踩坑和經驗總結&#xff0c;希望對…

數據驅動下的連鎖模式復制:技術科普與方法論深度解析

前言在連鎖經營的賽道上&#xff0c;“復制”是核心命題&#xff0c;但絕非簡單的“粘貼”。當行業進入數字化深水區&#xff0c;數據驅動正成為連鎖模式突破增長瓶頸、實現高效復制的“隱形引擎”。本文將從技術科普與方法論心得兩個維度&#xff0c;深度拆解數據如何重塑連鎖…

數據庫學習MySQL系列2、Windows11系統安裝MySQL方法一.msi安裝詳細教程

方法一.msi安裝詳細教程 Windows系統下MySQL——.msi安裝詳細教程&#xff08;默認--只安裝服務端“Server only”&#xff09;MySql官網地址&#xff1a;https://www.mysql.com/&#xff1b;快速下載通道請單擊→ No thanks, just start my download.ps&#xff1a;其他資源(…

html+css+vue實現增刪改查

代碼如下&#xff1a;<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>優化版 Vue.js CRUD 示例&l…

(計算機網絡)DNS解析流程及兩種途徑

在計算機網絡中&#xff0c;DNS&#xff08;Domain Name System&#xff09;用于 將域名解析為 IP 地址。一個完整的解析過程涉及 遞歸查詢、迭代查詢&#xff0c;以及多個關鍵角色&#xff08;LDNS、本地域名服務器&#xff1b;根服務器&#xff1b;頂級域名服務器&#xff1b…

數據結構——隊列(Java)

一.基本概念 隊列用來存儲邏輯關系為“一對一”的數據&#xff0c;是一種“特殊”的線性存儲結構。 特點&#xff1a; ?先進先出&#xff1a;隊列中元素的添加&#xff08;入隊enqueue&#xff09;和移除&#xff08;出隊dequeue&#xff09;遵循先進先出的原 則。 ?端點&…

【Go】:mac 環境下GoFrame安裝開發工具 gf-cli——gf_darwin_arm64

當前主要是關于gf_darwin_arm64的安裝步驟 如何快速給mac電腦安裝gfgf是什么安裝步驟方法1&#xff1a;去github下載gf-cli去git上下載對應電腦版本的gf-cli驗證下載文件是否二進制文件授予該文件權限方法2&#xff1a;去goframe官網教你下載步驟驗證gf是否安裝成功可能遇到的問…

【新】ApiHug官方文檔-ApiHug Spring Security 擴展-補充說明

概述 在上次說明中我們寫了ApiHug 如何做授權的&#xff0c; 這里有個概念的混淆&#xff0c; 其實 apihug 不是在spring security 上做的安全擴展&#xff0c; 應該是 apihug spring, 安全設計框架&#xff0c; 和本身 spring security 沒有半毛錢關系&#xff0c; 而如果你…

【Flask】測試平臺開發,新增說明書編寫和展示功能 第二十三篇

概述&#xff1a;本篇是接著上一篇&#xff0c;細分出說明書的編寫部分&#xff0c;實現這個功能的需求&#xff0c;是內部很多同事反饋&#xff0c;需要有個地方存工具&#xff0c;并且可以寫說明書&#xff0c;如果需要的人&#xff0c;那么可以在界面上直接下載工具和查看工…

Mac設置中的安全性缺少“任何來源”

問題&#xff1a;用Mac安裝軟件&#xff0c;隱私性與安全性&#xff0c;想切換“任何來源”用來下載網站的app&#xff0c;但是菜單欄找不到“任何來源”選項&#xff0c;無法安裝dmg的文件終端中一行代碼設置出來&#xff1a;sudo spctl --global-disable &#xff08;禁用Mac…

uniapp開發小程序,列表 點擊后加載更多數據

一、需求 1.初始顯示限制:將每頁條數limit改為5,確保初始只顯示5條數據 2.查看更多功能:添加了loadMore方法,點擊"查看更多"時加載下一頁數據 3.實現查看更多功能,點擊后加載更多數據 4.添加loading狀態防止重復請求 添加hasMore狀態判斷是否還有更多數據 …