iOS開發幾年了,你清楚OC中的這些東西麼1

2021-09-08 12:04:41 字數 3176 閱讀 3233

前言

1.oc中的物件的建立: 首先會通過 +(id)alloc 動態的分配所有的變數以及父類定義的變數所需要的足夠記憶體, 同時會清除所有的分配的記憶體空間, 全部置為0

2.同時接著需要呼叫class的 -(id)init 方法, 這個方法給每個變數設定初始值

3.返回的型別為id, id是乙個可以指向任意型別的指標(不用 * 號), 這個在一定程度上可以完成多型的效果

4.對oc中的class檔案的理解: class, extension, category

zjperson.**件

zjperson.m檔案

zjperson.m檔案

5.[[xxobject alloc] init] 初始化方法不需要引數的時候, 和 [xxobject new] 方法相同

6.通過字面量來初始化物件, 例如

nsstring *string = @"string"; == [[nsstring alloc] initwithstring:@"string"];等初始化方法

nsnumber *mybool = @yes; == [[nsnumber alloc] initwithbool:yes];

nsnumber *myfloat = @3.14f; ==

nsnumber *myint = @42; ==

nsnumber *mylong = @42l; ==...

7.oc(c)中多行巨集的定義(這個在swift…中更方便直接乙個全域性的函式就搞定了): 在除了最後一行的每一行結尾加一條反斜槓 \

8.比較是否相同: 使用 if(a==b) {}, 如果a,b是物件型別, 那麼比較的是指標是否相同, 而不是比較值是否相同, 如果a, b是基本型別(int, double…), 那麼比較的是值是否相同; 使用if ([a isequal: b]) , 則比較的是a,b的值是否相同

9.初始化基本型別的時候盡量設定初始值, 因為編譯器分配的初始值並不確定, 但是物件型別會預設初始化為nil

10.條件判斷: 當物件不為nil(有記憶體位址)的時候, 或者基本型別非0, 或者bool型別為true, 這個時候條件都為真, 其他情況條件為假

11.oc中屬性的getter和setter

@property (nonatomic) nsstring *name;

[self setname:@"set name"];

nsstring *getname = [self name];

也可以通過點語法訪問(實際上是會自動呼叫set和get方法)

self.name = @"set name";

nsstring *dotname = self.name;

- (nsstring *)name , 這樣寫編譯器是會報錯的, 需要寫成 if(a == 1) , 當然你非要使用乙個等號也是可以的, 需要額外加乙個括號, if ((a = 1))

27.實際上絕大多數情況下都是我們寫條件判斷的時候都是使用==, 而非 =, 也就只有當我們寫構造方法的時候才可能會寫到 =,像這樣 if (self = [super init]) , 其實這並不是使用=來判斷條件相等是正確的, 只是在這裡, 通過[super init]方法會返回乙個id物件, 通過, self = [super init], 把這個物件賦值給self, 這個時候的 if就是用來判斷, 被賦值後的self是否為nil, 而不是 self是否等於[super init]返回的物件.

28.在oc中block是object型別的, 所以是可以儲存在nsarray…中, 同時在呼叫block的時候, 如果block為nil(未賦值), 那麼程式將crash.

29.oc中block可以捕獲變數, 什麼意思呢 — 就是block會預設捕獲到變數的值, 在之後不受到原來變數的改變的影響, 例如

int aninteger = 42;

void (^testblock)(void) = ^{

nslog(@"integer is: %i", aninteger);

aninteger = 84;

testblock(); ---- 輸出的值仍然為 42

30.第二種block捕獲變數的方式, 是捕獲變數的指標, **獲的變數值改變, 則block中的變數值也改變了,不過需要對變數進行__block標記, 例如上面的**, 只改變一點, 結果就變了

__block int aninteger = 42;

void (^testblock)(void) = ^{

nslog(@"integer is: %i", aninteger);

aninteger = 84;

testblock(); --- 輸出值這時是 84

31.伴隨著block能夠捕獲變數的能力的乙個問題就是, 迴圈引用, 在arc中, 只要不是用到純c語言的庫,管理記憶體的工作都不需要我們完成, 但是迴圈引用卻是我們需要解決的, 最常見的就是當block捕獲的變數是乙個物件的屬性(方法)的時候, 也就是會捕獲到self, 那麼這個時候就可能會造成迴圈引用(block屬性應該被標記為copy), 解決方法也很簡單, 使用乙個對self弱引用的指標即可, 這個寫法就很多了, 筆者習慣的寫法是: __weak typeof(self) weakself = self;, 那麼在block中使用weakself替代self呼叫相關的屬性或者方法, 就不會造成迴圈引用

按照慣例, 我的文章裡面都會有demo的, 但是這篇文章沒有demo, 因為這只是寫一點點語法的東西

iOS開發幾年了,你清楚OC中的這些東西麼

zeroj 前言 oc中的物件的建立 首先會通過 id alloc 動態的分配所有的變數以及父類定義的變數所需要的足夠記憶體,同時會清除所有的分配的記憶體空間,全部置為0 同時接著需要呼叫class的 id init 方法,這個方法給每個變數設定初始值 返回的型別為id,id是乙個可以指向任意型別的...

iOS開發 在Swift中呼叫oc庫

先列舉這個工程中用到的oc原始碼庫 注意標頭檔案名字的命名規範 專案名稱 brdging header.h,如下圖。匯入成功後,接下來測試如何引用,下面以及呼叫mjrefresh庫為例,只要uirefreshcontrol宣告變數能編譯能通過,就說明能正常呼叫,具體使用方法參見mjrefresh的相...

ios開發 OC記憶體管理的學習

今天我學習了oc中重點的內容,記憶體管理,由於內容較多,需要慢慢消化,下面是具體學習內容 記憶體管理的學習 1.基本實現方法 1 retain 計數器 1,會返回物件本身 2 release 計數器 1,沒有返回值 3 retaincount 獲取當前的計數器 4 dealloc 當乙個物件要被 的...