国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS 代碼書寫的整潔與美化

2019-11-09 17:26:14
字體:
來源:轉載
供稿:網友

1.善用#PRagma mark

利用pragma mark xxx 分割你的代碼 例如一個視圖控制器可以分割為如下部分

Class Methods 類方法View Life Cycle 控制器視圖生命周期Setter 方法Getter 方法Actions Button 的行動Help Methods 輔助方法Deleagte/DataSource 協議

這時候,方法列表是這樣的

這里寫圖片描述

多用Setter Getter 方法

顯然,把一些代碼寫在Setter Getter 方法中 更方便檢索

Getter

通過Getter 方法,我把對imageView的初始化和配置全部集中在Getter方法中。

爭論 if(!_xxx){…} 這個判斷可能會影響及其細微的性能,也可以去掉這個判斷,看個人喜好來.

#pragma mark Getter- (UIImageView *)imageView { if (!_imageView) { _imageView = [[UIImageView alloc] init]; _imageView.backgroundColor = [UIColor redColor]; _imageView.contentMode = UIViewContentModeScaleaspectFit; } return _imageView;}

Setter

Setter 方法,我經常會將設置某些屬性時,連帶的操作寫在其中。 這對封裝很有必要。

這段代碼,我在給image 屬性賦值的時候,就連帶著給self.imageView.image 屬性賦值。 避免了暴露imageView

//public @property (nonatomic, strong) UIImage *image;//private @property (nonatomic, strong) UIImageView *imageView;#pragma mark Setter- (void)setImage:(UIImage *)image { _image = image; self.imageView.image = image;}

KVO相較于Setter 方法,可以提供更多的功能,來解決一些問題. 但是KVO讓代碼過于凌亂,或許可以試試Reactive Cocoa,可是學習它值得嗎,調試很讓人頭疼…值得思考

2.好的書寫風格

屬性聲明問題

@property (原子性,存儲屬性,訪問限制) NSString *example;

if語句

if (x.text.length > 0) { self.placeholderLabel.alpha = 0;} else { self.placeholderLabel.alpha = 1;} 而不是if(x.text.length > 0){ self.placeholderLabel.alpha = 0;}else{ self.placeholderLabel.alpha = 1;}

名稱寫法

類 大駝峰實例 小駝峰OC方法 小駝峰C方法 大駝峰宏定義 大駝峰

括號

盡量使用括號使得語句清晰,而不是根據運算符優先級判斷。

//避免出現這種寫法xx&xx||xx&xx

方法書寫

- (void)method {}而不是-(void)method{}

枚舉

使用NS_ENUMtypedef NS_ENUM(NSUInteger, XJYLineChartType) { //僅有線和橫豎坐標 XJYLineChartTypeSimple, //有表格 default XJYLineChartTypeNormal, //有數值 XJYLineChartTypeDetail,};而不是 enumtypedef enum DrawLineType{ PointType = 0, BrokenType , BezierType,}DrowLineType;

3.注釋

對外暴露的接口

/// 注釋或/** 注釋 */

代碼內部注釋

由于Objective-C 變量,方法名稱是自解釋的,所以只需在一些關鍵部位加上注釋 1. 代碼功能的核心 2. 提供視覺上的提醒 3. 較難理解的部分

及時刪除注釋掉的代碼部分

既然該段代碼沒有用處,就不應該來干擾程序員閱讀代碼。及時刪掉即可。

函數代碼間空行

根據功能塊空行跟注釋結合空行不要頻繁空行

好的例子

// Will undo the runtime changes made.static void aspect_cleanupHookedClassAndSelector(NSObject *self, SEL selector) { NSCParameterAssert(self); NSCParameterAssert(selector); Class klass = object_getClass(self); BOOL isMetaClass = class_isMetaClass(klass); if (isMetaClass) { klass = (Class)self; } // Check if the method is marked as forwarded and undo that. Method targetMethod = class_getInstanceMethod(klass, selector); IMP targetMethodIMP = method_getImplementation(targetMethod); if (aspect_isMsgForwardIMP(targetMethodIMP)) { // Restore the original method implementation. const char *typeEncoding = method_getTypeEncoding(targetMethod); SEL aliasSelector = aspect_aliasForSelector(selector); Method originalMethod = class_getInstanceMethod(klass, aliasSelector); IMP originalIMP = method_getImplementation(originalMethod); NSCAssert(originalMethod, @"Original implementation for %@ not found %@ on %@", NSStringFromSelector(selector), NSStringFromSelector(aliasSelector), klass); class_replaceMethod(klass, selector, originalIMP, typeEncoding); AspectLog(@"Aspects: Removed hook for -[%@ %@].", klass, NSStringFromSelector(selector)); } // Deregister global tracked selector aspect_deregisterTrackedSelector(self, selector); // Get the aspect container and check if there are any hooks remaining. Clean up if there are not. AspectsContainer *container = aspect_getContainerForObject(self, selector); if (!container.hasAspects) { // Destroy the container aspect_destroyContainerForObject(self, selector); // Figure out how the class was modified to undo the changes. NSString *className = NSStringFromClass(klass); if ([className hasSuffix:AspectsSubclassSuffix]) { Class originalClass = NSClassFromString([className stringByReplacingOccurrencesOfString:AspectsSubclassSuffix withString:@""]); NSCAssert(originalClass != nil, @"Original class must exist"); object_setClass(self, originalClass); AspectLog(@"Aspects: %@ has been restored.", NSStringFromClass(originalClass)); // We can only dispose the class pair if we can ensure that no instances exist using our subclass. // Since we don't globally track this, we can't ensure this - but there's also not much overhead in keeping it around. //objc_disposeClassPair(object.class); }else { // Class is most likely swizzled in place. Undo that. if (isMetaClass) { aspect_undoSwizzleClassInPlace((Class)self); }else if (self.class != klass) { aspect_undoSwizzleClassInPlace(klass); } } }}

好的編程思想

函數式編程的一些思想很好

1. 抽取方法中沒有”副作用”

所謂”副作用”(side effect),指的是函數內部與外部互動(最典型的情況,就是修改全局變量的值),產生運算以外的其他結果。

2.引用透明

引用透明(Referential transparency),指的是函數的運行不依賴于外部變量或”狀態”,只依賴于輸入的參數,任何時候只要參數相同,引用函數所得到的返回值總是相同的

Block,Notification,Deleagte的選擇

Block和Deleagte 之間的選擇

盡量使用代理,Block 雖然省事,但是后患無窮啊。

Notification

一對多通信的最佳選擇

要在代碼中的兩個不相關的模塊中傳遞消息時,通知機制是非常好的工具。通知機制廣播消息,當消息內容豐富而且無需指望接收者一定要關注的話這一招特別有用。 通知可以用來發送任意消息,甚至可以包含一個 userInfo 字典。你也可以繼承 NSNotification 寫一個自己的通知類來自定義行為。通知的獨特之處在于,發送者和接收者不需要相互知道對方,所以通知可以被用來在不同的相隔很遠的模塊之間傳遞消息。這就意味著這種消息傳遞是單向的,我們不能回復一個通知。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江安县| 阳泉市| 抚宁县| 金堂县| 黄平县| 汉寿县| 定南县| 德江县| 兴山县| 万山特区| 鄂尔多斯市| 霍城县| 滦平县| 拜泉县| 定陶县| 宁德市| 屏东县| 青阳县| 育儿| 庆城县| 蒙城县| 陆河县| 砀山县| 沅江市| 化州市| 郧西县| 南江县| 鸡泽县| 五华县| 黄浦区| 祁东县| 措美县| 河源市| 洪雅县| 新巴尔虎右旗| 双辽市| 德兴市| 新化县| 青神县| 贞丰县| 崇左市|