iOS開發中的小Tips(一)

秦小風發表於2017-12-21
開發過程中難免會遇到這樣那樣的問題,接下來我將自己開發中遇到的一些問題列舉一些,一來是希望自己記得 不再犯類似的錯誤,二來是希望能夠幫助遇到這些問題的同學。如果寫的有錯誤的地方,希望大家批評指正。PS:以下的遇到的這些問題在我的印象筆記中都可以找到。需要印象筆記共享的同學可以聯絡我。
郵箱:
shavekevin@gmail.com 。
複製程式碼

1.取消cell的分割線

tableview.separatorStyle = UITableViewCellSeparatorStyleNone;
複製程式碼

2.UITabelviewCell 的高亮狀態的取消 用以下方法:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    //設定cell的背景是透明的。
    cell.backgroundColor = [UIColor clearColor];
    //取消cell的高亮狀態
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}


//使用下面的這個方法會導致cell不能響應點選事件

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    return YES;
}
複製程式碼

3.設定分割線的左右偏移量

tableview  setSeparatorInset:inset
複製程式碼

4.類的宣告和實現,書寫的時候。容易犯的錯誤有一下幾種情況。

(1).只寫宣告,不寫實現。

(2).將@end這個結束標記忘記了。

(3).類的宣告或者實現都不能寫下C語言的函式中。

(4).屬性的宣告必須寫在大括號中。

(5).在宣告屬性的時候,不能夠直接賦值。

(6).宣告和實現不能夠巢狀使用。

5.更換頭像後,好友不會立馬看到我們更換的新頭像。請問使用來哪種機制來更新本地的快取。

IM透傳 發個訊息過去 攜帶新頭像 好友接到後更新。

6.推送如何跳轉到對應的controller

跳轉介面

- (void)push:(NSDictionary *)params
{
    // 類名
    NSString *class =[NSString stringWithFormat:@"%@", params[@"class"]];
    const char *className = [class cStringUsingEncoding:NSASCIIStringEncoding];

    // 從一個字串返回一個類
    Class newClass = objc_getClass(className);
    if (!newClass)
    {
        // 建立一個類
        Class superClass = [NSObject class];
        newClass = objc_allocateClassPair(superClass, className, 0);
        // 註冊你建立的這個類
        objc_registerClassPair(newClass);
    }
    // 建立物件
    id instance = [[newClass alloc] init];
 // 對該物件賦值屬性
    NSDictionary * propertys = params[@"property"];
    [propertys enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        // 檢測這個物件是否存在該屬性
        if ([self checkIsExistPropertyWithInstance:instance verifyPropertyName:key]) {
            // 利用kvc賦值
            [instance setValue:obj forKey:key];
        }
    }];

    // 獲取導航控制器
    UITabBarController *tabVC = (UITabBarController *)self.window.rootViewController;
    UINavigationController *pushClassStance = (UINavigationController *)tabVC.viewControllers[tabVC.selectedIndex];
    // 跳轉到對應的控制器
    [pushClassStance pushViewController:instance animated:YES];
}
複製程式碼

檢測物件是否存在該屬性

- (BOOL)checkIsExistPropertyWithInstance:(id)instance verifyPropertyName:(NSString *)verifyPropertyName
{
    unsigned int outCount, i;

    // 獲取物件裡的屬性列表
    objc_property_t * properties = class_copyPropertyList([instance
                                                           class], &outCount);

    for (i = 0; i < outCount; i++) {
        objc_property_t property =properties[i];
        //  屬性名轉成字串
        NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
        // 判斷該屬性是否存在
        if ([propertyName isEqualToString:verifyPropertyName]) {
            free(properties);
            return YES;
        }
    }
    free(properties);

    return NO;
}
複製程式碼

來源於簡書: iOS 萬能跳轉介面方法 runtime實用篇一

7.3D效果 還不錯哦

https://github.com/nicklockwood/iCarousel

8.xcode7引入xmpp提示module libxmlsimu not found怎麼解決?

解決方案如下圖:

-DL7D3-Q-NC-N`8E`40YC-2.jpg

9.data進行MD5 加密

https://github.com/shaojiankui/iOS-Categories/blob/master/Categories/Foundation/NSData/NSData%2BHash.m

10.UIVisualEffectView 背景是虛化的(類似我們iphone檢視通知時的虛化背景)

https://github.com/nicklockwood/FXBlurView

11.NSDate 的坑

Also when using a date format string using the correct format is important.

@"YYYY" is week-based calendar year.

@"yyyy" is ordinary calendar year.

可以看下面這篇部落格:NSDateFormatter 'YYYY' 和 'yyyy' 的區別

12.swift 實時濾鏡

http://blog.csdn.net/zhangao0086/article/details/39433519

13.動態載入視訊

http://www.jianshu.com/p/3dcebf0493d1

14.swift 閉包

http://www.henishuo.com/closures-of-swift/

15.理解contentsScale

http://joeshang.github.io/2015/01/10/understand-contentsscale/#disqus_thread

16.圖文混排

https://github.com/12207480/TYAttributedLabel

17.取消所有請求

[NSObject cancelPreviousPerformRequestsWithTarget:selfselector:@selector(sendContentReqData)object:nil];
複製程式碼

18.重新整理tableView某一行

[m_tableView reloadRowsAtIndexPaths:[NSArrayarrayWithObject:[NSIndexPathindexPathForRow:m_selectRowinSection:0]]withRowAnimation:UITableViewRowAnimationRight];
複製程式碼

19.textField 文字上下居中

textField.contentVerticalAlignment =UIControlContentVerticalAlignmentCenter;

 
//.全部刪除按鈕
 
textField.clearButtonMode =UITextFieldViewModeWhileEditing;
 
[textFieldsetAutocapitalizationType:UITextAutocapitalizationTypeNone];

複製程式碼

20.模擬導航條顏色

 UINavigationBar *tmpNavBar=[[UINavigationBar alloc]initWithFrame:CGRectMake(0, 0, screenRect.size.width, 44)];
 
tmpNavBar.barStyle=UIBarStyleDefault;
 
 self.m_navigationBar=tmpNavBar;
 UINavigationItem *tmpNavItem=[[UINavigationItemalloc]initWithTitle:@"Search"];
 UIBarButtonItem *tmpBarItem=[[UIBarButtonItem alloc]initWithTitle:@"Done"style:UIBarButtonItemStyleDone target:selfaction:@selector(exitSearchScreen)];
 
  [tmpNavItem setRightBarButtonItem:tmpBarItem];
 
 [m_navigationBar setItems:[NSArray arrayWithObject:tmpNavItem]];
       
  [self addSubview:m_navigationBar];
       
複製程式碼

21.陣列、字典內容不能為空,裝的是地址,為空就是野指標

22.陣列,字典訪問不能越界

23.代理最好在dealloc裡設定為nil,單利必須設定,因為一個類釋放了,但是單利指標還指向這個類,可能會出問題。

24.防止野指標,代理處崩潰多為此現象。

25.字串判斷不為空,一般 str!= nil && ![str isEqualTo@""] , 不等於nil是有地址,後者是內容不為空。

26.下面的view或self.view如果小於上面的,上面的view超過下面的部分將無法與使用者互動。

27.自定義cell時,最好在cell.contentView上加控制元件

28.儘量使用點語法,減少記憶體洩漏

29.正則

(?<=src\s*\=\s*\")[\d\D]+?(?=\")
複製程式碼

取出html 中的src 圖片

30.不能重複釋放

31.兩個物件不能相互引用

32.dealloc的super dealloc必須放在最後面

33.所有不帶星號的和id型別的都只能assign

34.系統執行緒也有副執行緒

35.一些變數最好都初始化,且寫在一個方法裡,需要恢復開始的狀態時可以直接呼叫該方法恢復

36.初始化的指標都要賦值為nil,系統不會幫你這麼做的

37.block 物件語法

(1).在內聯Block Objects可以直接讀取物件self,獨立的BlockObjects若想讀取self物件必須將其設定為引數傳遞進去。

(2).在內聯Block Objects可以直接用點語法讀取物件self的屬性,也可以使用setter和 getter方法,但是,獨立的Block Objects只能用setter and getter方法讀取物件self的屬性

38.改變導航條顏色

[nav.navigationBar setTintColor:[UIColorgrayColor]];
 
nav.navigationBar.barStyle =UIBarStyleBlackTranslucent;
複製程式碼

39.程式崩潰處理方法

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 
{
 
NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
 
}
複製程式碼

呼叫下面的方法,如陣列越界,呼叫不存在的方法等會打出詳細的資訊。

void UncaughtExceptionHandler(NSException*exception) {
 
   NSArray *arr = [exception callStackSymbols];
 
   NSString *reason = [exception reason];
 
   NSString *name = [exception name];
 
   NSLog(@"\nname: %@\reason: %@\nuserInfo: %@\ncallStackSymbols:%@\ncallStackReturnAddresses: %@",name,reason,[exceptionuserInfo],arr,[exceptioncallStackReturnAddresses]);
 
}
複製程式碼

開啟殭屍模式 Object-C的Enable Zombie Objects勾選,Memory 中的MallocStack勾選,Exceptions裡的Log Exceptions勾選

40.NSLog 怎麼列印出變數型別的?


NSStringFromSelector(SEL aSelector);

NSSelectorFromString(NSString *aSelectorName);

NSStringFromClass(Class aClass);

NSClassFromString(NSString *aClassName);

NSStringFromProtocol(Protocol *proto)

NSProtocolFromString(NSString *namestr) 

NSStringFromCGPoint(CGPoint point);

NSStringFromCGVector(CGVector vector);

NSStringFromCGSize(CGSize size);

NSStringFromCGRect(CGRect rect);

NSStringFromCGAffineTransform(CGAffineTransform transform);

NSStringFromUIEdgeInsets(UIEdgeInsets insets);

NSStringFromUIOffset(UIOffset offset);

CGPointFromString(NSString *string);

CGVectorFromString(NSString *string);

CGSizeFromString(NSString *string);

CGRectFromString(NSString *string);

CGAffineTransformFromString(NSString *string);

UIEdgeInsetsFromString(NSString *string);
 
UIOffsetFromString(NSString *string);
複製程式碼

個人部落格 http://shavekevin.com/#blog

QQ交流群:214541576 歡迎大家進群交流。

相關文章