ios 知識

IOS 類文件.h和.m中@interface的區別
大家都知道我們在創建類文件時會發現:

#import <UIKit/UIKit.h>@interface ViewController : UIViewController@end

#import "ViewController.h"@interface ViewController ()@end

那么他們之間有何區別呢?

1、.h里的@interface,是典型的頭文件,它的屬性(@property)和方法(functions)都是能夠向其他類公開的。我們都知道有三種權限@private,@protected,@public。寫在.h里的默認是@protected權限。

2、.m里的@interface,我們也可以稱之為擴展(class extension),是.h文件中@interface的補充。可以增加屬性,方法和成員變量,但是只能在.m文件里可見,對外是不開放的。在.m里的默認是@private權限

@END.

@property的作用和atomic和nonatomic

參考
當我們寫下@property NSObject *foo時,編譯器幫我們做了以下幾件事:

創建實例變量_foo
聲明foo屬性的setter、getter方法
實現foo屬性的setter、getter方法
@property 的本質是什么?

@property = ivar + getter + setter;實例變量+get方法+set方法,也就是說使用@property 系統會自動生成setter和getter方法;

@property的屬性關鍵字詳解
atomic和nonatomic
atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。

atomic:系統生成的 getter/setter 會保證 get、set 操作的完整性,不受其他線程影響。getter 還是能得到一個完好無損的對象(可以保證數據的完整性),但這個對象在多線程的情況下是不能確定的。

舉個🌰
如果線程 A 調了 getter,與此同時線程 B 、線程 C 都調了 setter——那最后線程 A get 到的值,有3種 可能:可能是 B、C set 之前原始的值,也可能是 B set 的值,也可能是 C set 的值。同時,最終這個屬性 的值,可能是 B set 的值,也有可能是 C set 的值。所以atomic可并不能保證對象的線程安全。

也就是說:如果有多個線程同時調用setter的話,不會出現某一個線程執行完setter全部語句之前,另一個線程開始執行setter情況,相當于函數頭尾加了鎖一樣,每次只能有一個線程調用對象的setter方法,所以可以保證數據的完整性。

atomic所說的線程安全只是保證了getter和setter存取方法的線程安全,并不能保證整個對象是線程安全的。

nonatomic:就沒有這個保證了,nonatomic返回你的對象可能就不是完整的value。因此,在多線程的環境下原子操作是非常必要的,否則有可能會引起錯誤的結果。但僅僅使用atomic并不會使得對象線程安全,我們還要為對象線程添加lock來確保線程的安全。

nonatomic的速度要比atomic的快。atomic是Objc使用的一種線程保護技術,這種機制是耗費系統資源的,所以在iPhone這種小型設備上,我們基本上都是使用nonatomic,而對象的線程安全問題則由程序員代碼控制。

atomic與nonatomic的本質區別其實也就是在setter方法上的操作不同

nonatomic對象、atomic對象setter和getter方法的實現:

/// nonatomic對象
- (void)setCurrentImage:(UIImage *)currentImage
{if (_currentImage != currentImage) {[_currentImage release];_currentImage = [currentImage retain];}
}
- (UIImage *)currentImage
{return _currentImage;
}/// atomic對象
- (void)setCurrentImage:(UIImage *)currentImage
{@synchronized(self) {if (_currentImage != currentImage) {[_currentImage release];_currentImage = [currentImage retain];}}
}- (UIImage *)currentImage
{@synchronized(self) {return _currentImage;}
}

總結:可以發現幾乎所有代碼的屬性設置都會使用nonatomic,這樣能夠提高訪問性能,在iOS中使用鎖機制的開銷較大,會損耗性能。

assign

1.這個修飾詞是直接賦值的意思 , 整型/浮點型等數據類型都用這個詞修飾 .
2.如果沒有使用 weak strong retain copy 修飾 , 那么默認就是使用 assign 了.
3.當然其實對象也可以用 assign 修飾 , 只是對象的計數器不會+1 . ( 與 strong 的區別 )
4.如果用來修飾對象屬性 , 那么當對象被銷毀后指針是不會指向 nil 的 . 所以會出現野指針錯誤 . ( 與weak的區別 )

weak

weak是弱引用,用weak描述修飾或者所引用對象的計數器不會加一,并且會在引用的對象被釋放的時候自動被設置為nil,大大避免了野指針訪問壞內存引起崩潰的情況,另外weak還可以用于解決循環引用。

weak原理概括
weak表其實是一個hash(哈希)表,Key是所指對象的地址,Value是weak指針的地址數組。weak的底層實現的原理是什么?

Runtime維護了一個weak表,用于存儲指向某個對象的所有weak指針。weak表其實是一個hash表,Key是所指對象的地址,value是weak指針的地址(這個地址的值是所指對象指針的地址)數組。

為什么value是數組?因為一個對象可能被多個弱引用指針指向

strong

在ARC環境下,只要某一對象被一個strong指針指向,該對象就不會被銷毀。如果對象沒有被任何strong指針指向,那么就會被銷毀。在默認情況下,所有的實例變量和局部變量都是strong類型的。可以說strong類型的指針在行為上跟非ARC下的retain是比較相似的

copy

淺拷貝

只是將對象內存地址多了一個引用,也就是說,拷貝結束之后,兩個對象的值不僅相同,而且對象所指的內存地址都是一樣的。
深拷貝

拷貝一個對象的具體內容,拷貝結束之后,兩個對象的值雖然是相同的,但是指向的內存地址是不同的。兩個對象之間也互不影響,互不干擾。

@interface 和 @implementation

在這里插入圖片描述
OC中的類必須包括兩部分,interface部分和implementation部分,這才是oc中的一個類的完整聲明;
OC中將成員變量和成員方法的聲明部分放置在interface部分中,包括繼承關系,protocal實現關系,都在interface里面的頭部進行聲明,
然后將實現部分放置在implementation部分中,相當于是將類拆分成聲明和實現兩部分,這兩部分缺一不可,所以在OC中,不妨不要將interface叫做接口,直接叫做類聲明部分來得容易理解多了,簡而言之,oc中interface是類的一個部分,和implementation共同組成一個完整的類。

- (instancetype)init

這個就是該類的初始化
參考

 (instancetype)init{self=[super init];if (self) {}NSLog(@"=========in MyView.init 函數里");return  self;
}

+和-

+號是static
在這里插入圖片描述

self 和 super

self指的是類對象本身;
super是父類對象本身;
self用來調用本類對象的方法;
self關鍵字先從本類中查找是否有此方法,如果沒有,再從父類中調用此方法;
super調用從父類繼承下來的方法;
super關鍵字直接調用父類中定義的方法.

//方法定義

(void)shopping;//不帶參數的方法
-(void)goshopping:(float)price; //帶參數的方法
-(id)someMethod:(int)someArg someOtherArgName:(int)someOtherArg; //otherParameter是參數的別名(第一個參數的別名省略),在函數調用時方便指定。

new、alloc

Object-C中的方法調用形式采用消息發送的方式,通常調用的形式如:

[someObject someMethod:firstArg someOtherArgName:otherArg];

實例的初始化也采用消息發送的形式,可以簡單的調用類型的new方法來獲取一個實例對象,簡單實例化的方法通常是:

someObject *obj = [someObject new]; //類的實例化

new 方法的實際過程是調用 alloc 和 init 方法,因此如果需要采用自定義的方法來初始化實例,則需要自己重寫 init 方法,通常的初始化方式為:

someObject *obj = [[someObject alloc] init]; //采用無參數的init實例化   
someObject *obj = [[someObject alloc] initWithArg:Arg]; //采用參數的實例化 

調用方法

在這里插入圖片描述
方法調用的本質就是放對象發送消息

/* new 會調用 init方法 */
People *man = [People new];//類調用new
People *man = [[People alloc] init];//類創建了個對象,調用init//屬性方法調用eat的方式
[man eat];
//類方法調用eat方式
[People eat];
[[People class] eat];//還有一種不常用的調用方式
[對象/類 performSelector:@selector(eat)];//底層實現
objc_msgSend(對象/屬性, @selector(eat));

//_render對象調用registerModule方法,參數是_lookupDescriptor

[_render registerModule:_lookupDescriptor];

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

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

相關文章

【Ajax】回調地獄解決方法

回調地獄&#xff08;Callback Hell&#xff09;是指在異步編程中&#xff0c;特別是在嵌套的回調函數中&#xff0c;代碼變得深度嵌套、難以閱讀和維護的現象。這通常發生在處理多個異步操作時&#xff0c;每個操作都依賴于前一個操作的結果。回調地獄使代碼變得難以理解、擴展…

顯卡服務器適用于哪些場景

顯卡&#xff08;GPU&#xff09;服務器&#xff0c;簡單來說&#xff0c;GPU服務器是基于GPU的應用于視頻編解碼、深度學習、科學計算等多種場景的快速、 穩定、彈性的計算服務。那么壹基比小鑫告訴你顯卡服務器主要的用途有哪一些。 一、運行手機模擬器 顯卡服務器可支持…

力扣:62. 不同路徑(Python3)

題目&#xff1a; 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。 問總共有多少條不同的路徑&…

WebRTC音視頻通話-WebRTC本地視頻通話使用ossrs服務搭建

iOS開發-ossrs服務WebRTC本地視頻通話服務搭建 之前開發中使用到了ossrs&#xff0c;這里記錄一下ossrs支持的WebRTC本地服務搭建。 一、ossrs是什么&#xff1f; ossrs是什么呢&#xff1f; SRS(Simple Realtime Server)是一個簡單高效的實時視頻服務器&#xff0c;支持RTM…

STM32CubeIDE的安裝和黑色主題及自動補全代碼

STM32CubeIDE之前用過一點時間&#xff0c;但后來因為不習慣放棄了最近在新電腦上又用起來了&#xff0c;感覺相對之前好了很多&#xff0c;其實如果在工作中基本使用的是STM32,用意法的生態軟件也挺好的&#xff0c;意法最近在這塊也在大力發展&#xff0c;STM32CubeIDE安裝包…

【BASH】回顧與知識點梳理(十三)

【BASH】回顧與知識點梳理 十三 十三. 文件內容查閱13.1 直接檢視文件內容&#xff1a;cat, tac, nlcat (concatenate)tac (反向列示)nl (添加行號打印) 13.2 可翻頁檢視&#xff1a;more, lessmore (一頁一頁翻動)less (一頁一頁翻動) 13.3 資料擷取&#xff1a;head, tailhea…

【Linux】云服務器自動化部署VuePress博客(Jenkins)

前言 博主此前是將博客部署在 Github Pages&#xff08;基于 Github Action&#xff09;和 Vercel 上的&#xff0c;但是這兩種部署方式對于國內用戶很不友好&#xff0c;訪問速度堪憂。因此將博客遷移到自己的云服務器上&#xff0c;并且基于 Jenkins&#xff08;一款開源持續…

浪涌保護器中SPD防雷模塊的主要應用方案

浪涌保護器&#xff08;Surge Protective Device&#xff0c;SPD&#xff09;是一種用于限制瞬態過電壓和導引泄放電涌電流的非線性防護器件&#xff0c;用以保護耐壓水平低的電器或電子系統免遭雷擊及雷擊電磁脈沖或操作過電壓的損害。SPD可以將過電壓泄放到地線或限制過電壓到…

類與對象(入門)

目錄 1.前言 2.類的引入 3.類的定義 4.類的訪問限定符及封裝 4.1 訪問限定符 4.2 封裝 5.類的作用域 6.類的實例化 7. 結構體內存對齊規則 8.this指針 8.1 this指針的引出 8.2 this指針的特性 1.前言 C 是 基于面向對象 的&#xff0c; 關注 的是 對象 &#xff0c;…

【Spring】核心容器——依賴自動裝配

Spring容器根據bean所依賴的資源在容器中自動查找并注入bean的過程叫做自動裝配自動裝配的方式 1、按類型 2、按名稱&#xff08;耦合性較高&#xff09; 3、按構造方法 自動裝配特點 1、自動裝配用于對引用類型進行依賴注入&#xff0c;不能對簡單類型進行操作 2、自動裝配的…

多元最短路(Floyd)

是一個基于動態規劃的全源最短路算法。它可以高效地求出圖上任意兩點之間的最短路 時間復雜度 O(n^3) 狀態轉移方程 f[i][j]min(f[i][j],f[i][k]f[k][j]) 核心代碼 void floyd(){for(int k1;k<n;k)for(int i1;i<n;i)for(int j1;j<n;j)s[i][j]min(s[i][j],s[i][k…

Vue前端 更具router.js 中的meta的roles實現路由衛士,實現權限判斷。

參考了之篇文章 1、我在登陸時獲取到登錄用戶的角色名roles&#xff0c;并存入sessionStorage中&#xff0c;具體是在login頁面實現&#xff0c;還是在menu頁面實現都可以。在menu頁面實現&#xff0c;可以顯得登陸快一些。 2、編寫router.js&#xff0c;注意&#xff0c;一個…

Spring 事務詳解

目錄 一、概述二、事務的特性&#xff08;ACID&#xff09;三、Spring 的事務管理3.1 編程式事務管理3.2 編程式事務管理 四、Spring 事務管理接口及其定義的屬性4.1 PlatformTransactionManager:事務管理接口4.2 TransactionDefinition:事務屬性4.3 TransactionStatus:事務狀態…

【基礎類】—前后端通信類系統性學習

一、什么是同源策略及限制 同源策略限制從一個源加載的文檔或腳本如何與來自另一個源的資源進行交互。這是一個用于隔離潛在惡意文件的關鍵的安全機制。源&#xff1a;協議、域名和端口&#xff0c; 默認端口是80 三者有一個不同&#xff0c;即源不同&#xff0c;就是跨域 ht…

Stable Diffusion+Temporal-kit 半虛半實應用

1.先下載temporal-kit,重啟webui 2.下載好ffmpeg,配置好環境,下載Ebsynth 3.準備好你需要的視頻,拖到預處理視頻位置 4.填寫參數,點解保存設置,然后并點擊生成,會生成到目標文件夾的input位置 5.然后拉出input文件夾里面你想切換成處理的幀圖片,然后填寫prompt查看效…

中國省級、城市-數字經濟創新創業、分項指數(2010-2020年)

一、數據介紹 數據名稱&#xff1a;中國省級、城市-數字經濟創新創業、分項指數 數據年份&#xff1a;2010-2020年 數據范圍&#xff1a;31省、336個城市 數據來源&#xff1a;北大企業大數據研究中心 二、參考文獻 參考文獻&#xff1a; 戴若塵,王艾昭,陳斌開.中國數字…

Win10使用Guest和空密碼訪問共享的完整步驟

目錄 前言 啟動Guest 給予Guest網絡權限 允許空密碼登陸 啟用不安全的來并登陸 總結 前言 我們經常需要使用空密碼和guest賬戶訪問Windows共享&#xff0c;因為某些設備不支持輸入密碼等&#xff0c;那么該如何設置呢&#xff0c;因為步驟比較固定而且繁瑣&#xff0c;于…

Python小白入門:文件、異常處理和json格式存儲數據

這里寫自定義目錄標題 所用資料 一、從文件中讀取數據1.1 讀取整個文件1.2 文件路徑1.3 逐行讀取1.4 創建一個包含文件各行內容的列表1.5 使用文件的內容1.6 包含一百萬位的大型文件1.7 圓周率值中包含你的生日嗎練習題 二、寫入文件2.1 寫入空文件2.2 寫入多行2.3 附加到文件練…

Maven 生成(打包)帶有依賴的可以直接執行的一個 jar 包

在pom中增加如下內容 <build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><archive><manifest><mainClass>com.example.xxx.YourClass</mainClass></manifest></…

酷開系統丨酷開會員,帶你解鎖K歌新姿勢

不管時代怎么變化&#xff0c;K歌這項娛樂活動始終深受人們的喜愛。不知道你有沒有遇到過這種情況&#xff1a;周末在家宅了一天&#xff0c;突然心血來潮想去KTV唱歌&#xff0c;但奈何外面過于悶熱實在不想出門&#xff0c;可在手機上唱歌又不過癮&#xff0c;讓人很是苦惱……