ARC最佳實踐

2021-06-18 16:47:19 字數 2222 閱讀 6710

常規

基本型別變數property使用assign

@property (nonatomic, assign) int scalarint;

@property (nonatomic, assign) cgfloat scalarfloat;

@property (nonatomic, assign) cgpoint scalarstruct;

物件的正向引用要用strong 

@property (nonatomic, strong) id childobject;
反向引用使用weak

@property (nonatomic, weak) id parentobject;

@property (nonatomic, weak) nsobject *delegate;

所謂的正向引用和反向引用就是用來解決物件迴圈依賴導致記憶體洩露的。

圖中uiviewcontroller 對uitableview的引用是正向引用(由左上角的箭頭決定),uitableview對uiviewcontroller的引用是反向引用。如反向引用是strong的,uiviewcontroller的retain計數就是2。當左上角的引用releaseuiviewcontroller物件後,它的計數就是1,而不是0,導致記憶體洩露。所以反向引用一定要是weak的。保證記憶體正常釋放。

block要使用copy

@property (nonatomic, copy) someblocktype someblock;
為什麼要用copy?當block首次建立的時候,block物件是被分配在方法棧中的。如果方法棧消失,即方法呼叫完畢,呼叫block會引起exc_bad_access等錯誤。所以要使用copy將block copy到堆中,這樣block就不受方法呼叫影響了。如果要將block放入list中,要copy一下:

someblocktype someblock = ^;

[somearray addobject:[someblock copy]];

在block中使用self,或者self的屬性,block都會引用self。如果block物件在堆中,就會引起引用迴圈。所以要將反向引用設定成weak的。

someblocktype someblock = ^;
someblocktype someblock = ^;

__weak someobjectclass *weakself = self;

someblocktype someblock = ^

else

};

someobjectclass *someobject = ...

__weak someobjectclass *weaksomeobject = someobject;// 儘管這個物件不是self,但是它和block形成了引用迴圈,同樣需要通過__weak打破迴圈

someobject.completionhandler = ^

else

};

dealloc中寫什麼

刪除observer

解除notification

設定非weak的反向引用為空

解除timmer

out-parameter 要加__autoreleasing修飾符

為了避免編譯器偶爾不在out-parameter前插入auto release修飾符,這裡建議加上。

- (bool)performwitherror:(__autoreleasing nserror **)error

else

}

nserror __autoreleasing *error = error;

bool ok = [myobject performoperationwitherror:&error];

if (!ok)

參考:

最佳實踐 Flutter 最佳實踐

最佳實踐是乙個領域可以接受的專業標準,對於任何程式語言來說,提高 質量 可讀性 可維護性和健壯性都非常重要。讓我們探索一些設計和開發flutter應用程式的最佳實踐。class enum typedef和extension應採用駝峰命名uppercamelcase規則。class mainscree...

JUnit最佳實踐

junit最佳實踐 cherami 轉貼 參與分 20053,專家分 4960 發表 2003 9 16 下午7 57 版本 1.0 閱讀 3899次 martin fowler說過 當你試圖列印輸出一些資訊或除錯乙個表示式時,寫一些測試 來替代那些傳統的方法。一開始,你會發現你總是要建立一些新的f...

SVN最佳實踐

楊爭 subversion是新一代的版本控制工具,由於其優於cvs的一些特點,得到了越來越多人的關注和使用,本人根據自己使用svn的經驗,寫了這篇文章,希望對大家有所幫助,其中有些實踐並不是僅僅適用於svn,對其他版本控制工具也是適用的。1 養成良好的記錄日誌的習慣.svn ci提交,最好在日誌中記...