利用pragma mark xxx 分割你的代碼 例如一個視圖控制器可以分割為如下部分
Class Methods 類方法View Life Cycle 控制器視圖生命周期Setter 方法Getter 方法Actions Button 的行動Help Methods 輔助方法Deleagte/DataSource 協議這時候,方法列表是這樣的

顯然,把一些代碼寫在Setter 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 方法,我經常會將設置某些屬性時,連帶的操作寫在其中。 這對封裝很有必要。
這段代碼,我在給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,可是學習它值得嗎,調試很讓人頭疼…值得思考
盡量使用括號使得語句清晰,而不是根據運算符優先級判斷。
//避免出現這種寫法xx&xx||xx&xx由于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); } } }}函數式編程的一些思想很好
所謂”副作用”(side effect),指的是函數內部與外部互動(最典型的情況,就是修改全局變量的值),產生運算以外的其他結果。
引用透明(Referential transparency),指的是函數的運行不依賴于外部變量或”狀態”,只依賴于輸入的參數,任何時候只要參數相同,引用函數所得到的返回值總是相同的
盡量使用代理,Block 雖然省事,但是后患無窮啊。
一對多通信的最佳選擇
要在代碼中的兩個不相關的模塊中傳遞消息時,通知機制是非常好的工具。通知機制廣播消息,當消息內容豐富而且無需指望接收者一定要關注的話這一招特別有用。 通知可以用來發送任意消息,甚至可以包含一個 userInfo 字典。你也可以繼承 NSNotification 寫一個自己的通知類來自定義行為。通知的獨特之處在于,發送者和接收者不需要相互知道對方,所以通知可以被用來在不同的相隔很遠的模塊之間傳遞消息。這就意味著這種消息傳遞是單向的,我們不能回復一個通知。
新聞熱點
疑難解答