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