OC 中例項變數與屬性之間的區別

2021-07-07 08:50:01 字數 1261 閱讀 8752

今天總結了以下內容, 先寫下來, 以備以後忘記, 或者是混亂時, 回頭來看一下…

例項變數(預設是私有的)用於類內部, 無需與外界接觸的變數, 不能使用點語法. 只用於簡單儲存資料, 不涉及到記憶體管理. 通過 _例項變數名 來呼叫, 只是簡單地指標賦值, 沒有呼叫 setter 方法, 引用計數不會增一.

允許讓其他物件訪問到該屬性, 可以使用點語法, 涉及到記憶體管理, 通過 self.object操作屬性, 通過 setter 和 getter 方法來呼叫, 在呼叫 setter 方法的過程中引用計數會發生變化

在類的初始化方法中, 會使用屬性的 setter 方法而不直接使用系統自動生成的例項變數的原因是因為如果直接使用系統自動生成的例項變數, 可能會造成野指標問題, 在 dealloc 方法中還會造成過度釋放的問題; 而使用 setter 方法時, 會先讓屬性的記憶體空間的引用計數加 1. 在初始化類物件的時候不會因為引數的釋放而造成記憶體問題

//先初始化乙個person類物件, 該類中有乙個屬性name

nsstring *name = [[nsstring alloc] initwithstring:@"sara"];

person *per = [[person alloc] initwithname:name];

[name release];

如果在自定義初始化方法中使用_name = name 的話僅僅只是簡單地讓_name指向 name 的記憶體空間, 而引用計數不變,當 name 釋放了之後, _name 指向的那塊記憶體空間已經被系統**, 就是野指標了, 這就產生了記憶體問題, 特別是在 mrc 的 dealloc 方法中有 self.name = nil;(==> [_name release]; _name = nil;)這就又產生了過度釋放的問題

由上面的例子可以總結出以下內容:

例項變數的使用時機是 : 在本類中只是簡單地儲存變數值, 而不涉及到釋放的時候使用

getter 方法的使用時機是 : 當後期這個類物件可能會被釋放, 而其他變數還需要繼續使用這個值的時候, 就需要對記憶體進行管理, 即對該塊記憶體空間的引用計數加 1, 而這不僅僅是簡單地賦值就能解決的. 所以在這種時候要使用 getter 方法,( 這塊記憶體空間會在將來的某一時刻被釋放).

OC中類的屬性與成員變數的區別

先看一段 inte ce viewcontroller uiviewcontroller 屬性 property nonatomic,strong nsarray array2 end 成員變數,本例中的是例項成員變數,是作用於整個類物件內的。從生命週期來看,它比區域性變數要長一些,但它預設是私有的...

OC 屬性與成員變數的簡單介紹與區別

property和 synthesize可以自動生成某個類成員變數的訪問方法 readwrite 這個屬性是預設的情況,會自動為你生成訪問器 assign 這個屬性一般用來處理基礎型別,比如int float等等,如果你宣告的屬性是基礎型別的話,assign是預設的,你可以不加這個屬性 natomi...

成員變數 例項變數 屬性之間的關係

首先來區別一下 例項變數 成員變數 的區別 可以看到在介面 inte ce 括號裡面的統稱為 成員變數 例項變數是成員變數中的一種!例項變數的英文翻譯是 instance variable object specificstorage 例項的英文翻譯為 instance manifestation ...