天天看點

iOS代碼習慣與代碼優化(一)

1.屬性修飾符運用需要注意的地方

在arc中,基本變量之外的屬性 弱引用最好使用weak,來避免野指針的出現,weak可以在指向的對象dealloc的時候自動置為nil。

在arc中強引用盡量使用strong,當然這裡strong和retain的作用是一樣的,但是為了保持代碼的一緻性,這裡推薦使用strong。

2.聲明常量

NSString *const kcircleModelDataCategoryName = @"categoryName";
           

如果常量不是全局的,請在前面加static。否則可能會産生duplicate symbol的錯誤。

如果需要聲明全局的常量,那麼需要在.h 檔案中加入。

FOUNDATION_EXPORT NSString * const kcircleModelDataCategoryName;
           

同樣我們可以使用宏來聲明變量,define預處理指令。使用預處理指令有這麼幾個缺點:定義出來的常量沒有類型資訊,預處理過程會将碰到的所有TAG_LOCK替換為1。而是用類型常量恰巧能解決這兩個問題。

3.程式中環境的切換

在開發過程中,經常需要切換環境。比如測試環境,開發環境,與生産環境。我們可以通過建構NSString的category傳回url。

#import "NSString+URL.h"
static NSString * const kBaseURL = @"http://220.175.104.19:8080";

@implementation NSString (URL)
+ (NSString *)RequestUrlWithString:(NSString *)url
{
    return [NSString stringWithFormat:@"%@%@",kBaseURL, url];
}
@end
           

使用方法:

NSString *url = [NSString RequestUrlWithString:@"xxx/xxxx"];

4.通知的添加和移除

看到有同僚使用這種方法來添加通知與移除通知

-(void)viewWillAppear:(BOOL)animated{
    
    [[NSNotificationCenter defaultCenter ] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil] ;
    
    [[NSNotificationCenter defaultCenter ] addObserver:self selector:@selector(keyboardWillHidden:) name:UIKeyboardWillHideNotification object:nil] ;
    
}
-(void)viewWillDisappear:(BOOL)animated{
    
    [[NSNotificationCenter defaultCenter ] removeObserver:self name:UIKeyboardWillHideNotification object:nil ] ;
    [[NSNotificationCenter defaultCenter ] removeObserver:self name:UIKeyboardWillShowNotification object:nil ];
    
}

           

因為willAppear和Disappear出現的順序并不一定是一對一的。是以有可能造成多次添加,多次移除通知。 當視圖沒有展示的時候視圖控制器就無法接受到通知,導緻一些操作沒有進行。

建議在 viewDidLoad裡添加通知。在dealloc裡移除通知。 當然在通知根視圖控制器 顯示操作時可以使用這種方法,避免所有已經load的控制器 響應該通知。

5.使用懶加載

在viewDidLoad之後,初始化的過程必然生成了對應的控件或者資料,無論這些控件或者資料是否立即有用,這會占用比較大的記憶體空間。 我們可以通過重寫屬性的get方法,來解決以上問題。

@property (nonatomic, strong) NSMutableArray *dataSource;

- (NSMutableArray *)dataSource {
    if (!_dataSource) {
        self.dataSource = [NSMutableArray array];
    }
    return _dataSource;
}
           

6.delegate需要校驗傳入參數

特别是封裝自己的UI控件時,當我們使用系統UI控件的代理方法時,就會發現,代理方法往往都會把控件對象作為參數傳遞過來。在這個方法中,可以通路該對象的屬性。

- (void)textViewDidEndEditing:(YYTextView *)textView {
    self.navigationItem.rightBarButtonItem = nil;
}
           

如果你的delegate方法,隻作為一個textView的委托回調,這種寫法沒有任何問題。但是如果你想擴充你的界面,在将來的界面中很可能出現另一個textView,這時你就必須區分這兩個textView是誰回調了這個代理方法。此時,如果你之前并沒有添加傳入參數判斷,那麼你還需要将之前的textView變量名字找到,并将之前的這些邏輯轉移到一個if分支内,然後才能處理新添加的textView邏輯,這時候你的思路很可能被打斷。更糟糕的是,很有可能是你的小夥伴來做這件事情。是以在擴充之前就先加上參數校驗是一個很好的習慣。

- (void)textViewDidEndEditing:(YYTextView *)textView {
    if (textView == self.textView) {
        self.navigationItem.rightBarButtonItem = nil;
    }

}
           

轉載于:https://www.cnblogs.com/xiongzhihua/p/5334880.html