開發小技巧和常見錯誤

1、XCode的 Stack Trace,調試時拋出異常,定位到某一行代碼html

在Xcode調試程序的時候,老是會出現不知道錯誤在什麼地方的問題,如今有一個辦法,能夠具體定位到錯誤行的代碼,試一下吧!java

操做以下:安全

一、在XCode界面中按cmd + 6快捷鍵,或者直接點擊選項卡,跳到Breakpoint的tabapp

二、而後點擊左下角的+號,增長一個Exception的斷點,以下圖所示。iphone

三、接下來會出現一個「All Exception」的調試選項:ide

四、將鼠標放到上面,右擊選擇「Edit Breakpoint」,能夠查看選項的具體內容以下:(不用作任何修改)svn


五、當異常出現時,會自動停在異常處,而不會拋出到UIApplicationMain。就能夠定位到具體拋出異常的代碼了。函數

2、iOS 協同開發出fatal error: file 'XX-Prefix.pch' has been modified since the precompiled header was built字體

在協同開發的時候,剛剛從svn下載到本地的代碼,出現「fatal error: file 'XX-Prefix.pch' has been modified since the precompiled header was built」的問題,這個其實不是什麼問題,解決方案以下:ui

一、找到  XX-Prefix.pch 文件  註釋掉下面的代碼:

1 #ifdef __OBJC__  
2     #import <UIKit/UIKit.h>  
3     #import <CoreData/CoreData.h>  
4     #import <Foundation/Foundation.h>  
5 #endif  

而後,從新編譯項目

二、打開上面步驟中的註釋

而後再次編譯運行,發現居然沒有上面的錯誤了,問題解決。

3、在Linux/Mac下面刪除全部的.svn文件

在使用svn管理代碼的時候,若是提交原有的svn管理下的project到新的svn目錄下時,須要先刪除原有的文件夾裏面的全部的.svn文件下面的全部內容,不然直接提交會致使失敗。

注意:最好先拷貝一個新的項目,而後刪除備份文件夾下面的.svn文件。以避免原有的svn項目有未提交的代碼,致使文件不能提交,形成丟失等。

下面這種方法能夠簡單的使用終端刪除全部的.svn文件。

一、首先先定位到你的項目的目錄文件下面,好比個人項目在桌面上的svnProject目錄下面,則須要在終端執行以下命令:

 

1 ~ mac$ cd Desktop/svnProject/  

執行完畢以後,就處在當前的svnProject目錄下面了。

二、再執行以下命令,就能夠刪除此目錄下面的全部的.svn文件了

svnProject mac$ find ./ -name ".svn" | xargs rm -Rf  

能夠看到此目錄下面的全部的.svn文件都被刪除了 ,包含子目錄中的.svn文件也被刪除了。

三、接下來就可使用此目錄下面的項目,上傳至svn了。

題外話:.svn文件一般是隱藏的,能夠參考 蘋果電腦MAC 在Finder裏面顯示隱藏文件方法 來顯示Mac電腦下面隱藏的文件。

4、 蘋果電腦MAC 在Finder裏面顯示隱藏文件方法

在終端裏輸入下面命令便可讓它們顯示出來。

  defaults write com.apple.finder AppleShowAllFiles -bool true

  若是想恢復隱藏,能夠用這個命令:

  defaults write com.apple.finder AppleShowAllFiles -bool false

  注意:一、執行命令後須要重啓 Finder 才能看到效果。

     二、不要亂動不懂的隱藏文件,可能會損壞你的系統。

  也能夠直接用這軟件實現隱藏:

  MacPilot

5、iOS如何使用第三方字體

一、從網上下載所需字體的TTF文件。將字體所對應的TTF文件拖入項目中。

二、而後在info.plist中添加一個新的鍵Fonts provided by application, NSArray類型的, 在其對應的item裏面的string值爲**.TTF,如圖:

三、接下來就是要知道對應字體的名字FontName了。一個字體文件包括如下幾個內容:文件名、字體名稱、字體具體名稱,咱們只有文件名,不知道字體名稱是什麼,更不知道具體的名稱,那麼咱們就須要寫代碼得到具體的字體名稱。方法以下:

NSArray *familys = [UIFont familyNames];  
      
    for (int i = 0; i < [familys count]; i++)  
    {  
        NSString *family = [familys objectAtIndex:i];  
        NSLog(@"=====Fontfamily:%@", family);  
        NSArray *fonts = [UIFont fontNamesForFamilyName:family];  
        for(int j = 0; j < [fonts count]; j++)  
        {  
            NSLog(@"***FontName:%@", [fonts objectAtIndex:i]);  
        }  
    }  

打印結果:

2013-04-10 17:37:09.758 FontDemo[3336:c07] =====Fontfamily:Thonburi

2013-04-10 17:37:10.442 FontDemo[3336:c07] ***FontName:Thonburi-Bold

2013-04-10 17:37:10.827 FontDemo[3336:c07] ***FontName:Thonburi-Bold

2013-04-10 17:37:12.403 FontDemo[3336:c07] =====Fontfamily:Snell Roundhand

2013-04-10 17:37:12.404 FontDemo[3336:c07] ***FontName:SnellRoundhand-Black

四、如今能夠知道文字包裏面的字體名稱了吧?接下來使用就能夠咯:

self.lblTitle.font = [UIFont fontWithName:@"SnellRoundhand-Bold" size:17.0];  

注意:

文字的使用但是有版權問題的噢,程序中要想使用某些特殊的文字,必須得有版權哦,不然最好不要用,會有侵權問題。

6、ARC下NSNotificationCenter須要remove

 - (void) dealloc
2 {
3     //  [super dealloc] 千萬不要多此一舉   
4     [[NSNotificationCenter defaultCenter] removeObserver:self]; 
5 }

7、const or #define

下面是你們常見的兩種定義優先選擇第二種

#define PI 3.14159  //只預處理時進行符號替換,不推薦
const doulbe Pi=3.14159 //安全性高,和效率上推薦

 

 

8、常量字符串聲明

Foo.h

extern NSString *const XXFooDidBarNotification;
 

Foo.m

NSString *const XXFooDidBarNotification =@"XXFooDidBarNotification」

9、調試的技巧

有沒有用過下面的log輸出呢?

-(void) buttonPressed :(UIButton *)button
{
  NSLog(@"Stack trace: %@", [NSThread callStackSymbols]);
  NSLog(@"Current selector: %@", NSStringFromSelector(_cmd)); 
  NSLog(@"Object class: %@", NSStringFromClass([self class]));
  NSLog(@"Filename: %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent]); 
  ...
}

10、註釋技巧

  在代碼中加註釋時,若是以 // TODO: 或 // FIXME: 或者 // !!!: 或 // ???: 開頭的話,此註釋會出如今方法的下列列表裏,方便往後跟蹤。利用Xcode4中的自定義代碼片斷,能夠用一個快捷鍵插入一個預先定義好的註釋片斷

11、獲取當前時間
 1 NSDateFormatter*formatter = [[NSDateFormatteralloc] init];
 2 [formatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
 3 NSString *locationString=[formatter stringFromDate: [NSDate date]];
 4 
 5 //獲取當前時間做爲productId
 6 NSDateFormatter*formatter = [[NSDateFormatteralloc] init];
 7 [formatter setDateFormat:@"hhmmss"];
 8 NSString *locationString=[formatter stringFromDate: [NSDate date]];
 9 downloadInfo.productId = locationString;
10 [formatter release];
/******************************************************************************
函數名稱 : getDate
函數描述 : 獲取當前日期時間
輸入參數 : N/A
輸出參數 : N/A
返回值 : NSString 當前時間
備註 :
******************************************************************************/
1 -(NSString *)getDate
2 {
3     NSDateFormatter*formatter = [[NSDateFormatteralloc] init];
4     [formatter setDateFormat:@"yyyy-MM-dd EEEE HH:mm:ss a"];
5     NSString *locationString=[formatter stringFromDate: [NSDate date]];
6     [formatter release];
7     return locationString;
8 }
大寫的H日期格式將默認爲24小時制,小寫的h日期格式將默認爲12小時
不須要特別設置,只須要在dataFormat裏設置相似"yyyy-MMM-dd"這樣的格式就能夠了
日期格式以下:
y 年 Year 1996; 96 
M 年中的月份 Month July; Jul; 07 
w 年中的週數 Number 27 
W 月份中的週數 Number 2 
D 年中的天數 Number 189 
d 月份中的天數 Number 10 
F 月份中的星期 Number 2 
E 星期中的天數 Text Tuesday; Tue 
a Am/pm 標記 Text PM 
H 一天中的小時數(0-23) Number 0 
k 一天中的小時數(1-24) Number 24 
K am/pm 中的小時數(0-11) Number 0 
h am/pm 中的小時數(1-12) Number 12 
m 小時中的分鐘數 Number 30 
s 分鐘中的秒數 Number 55 
S 毫秒數 Number 978 
z 時區 General time zone Pacific Standard Time; PST; GMT-08:00 
Z 時區 RFC 822 time zone -0800
 
12、讀取和寫入plist文件
plist文件是標準的xml文件,在cocoa中能夠很簡單地使用。這裏介紹一下使用方法: 
如下代碼在Mac和iPhone中均適用。
寫入plist文件: 
NSMutableDictionary* dict = [ [ NSMutableDictionaryalloc ] initWithContentsOfFile:@"/Sample.plist"];
[ dict setObject:@"Yes"forKey:@"RestartSpringBoard"];
[ dict writeToFile:@"/Sample.plist"atomically:YES];
讀取plist文件:
NSMutableDictionary* dict = [ [ NSMutableDictionaryalloc ] initWithContentsOfFile:@"/Sample.plist"];
NSString* object = [ dict objectForKey:@"RestartSpringBoard" ];
 
十3、iphone程序中實現截屏的方法
在iphone程序中實現截屏的一種方法:
//導入頭文件
#import QuartzCore/QuartzCore.h
//將整個self.view大小的圖層形式建立一張圖片image
UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage*image=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//而後將該圖片保存到圖片圖

UIImageWriteToSavedPhotosAlbum(image,self,nil,nil);

截取屏幕圖片
//建立一個基於位圖的圖形上下文並指定大小爲CGSizeMake(200,400)
UIGraphicsBeginImageContext(CGSizeMake(200,400));

//renderInContext 呈現接受者及其子範圍到指定的上下文
[self.view.layerrenderInContext:UIGraphicsGetCurrentContext()];

//返回一個基於當前圖形上下文的圖片
UIImage *aImage =UIGraphicsGetImageFromCurrentImageContext();

//移除棧頂的基於當前位圖的圖形上下文
UIGraphicsEndImageContext();

//以png格式返回指定圖片的數據
imageData = UIImagePNGRepresentation(aImage);

十4、Objective-c 畫圖

1.顏色和字體

UIKit提供了UIColor和UIFont類來進行設置顏色和字體,

UIColor *redColor=[UIColor redColor];

[redColor set];//設置爲紅色

UIFont *front=[UIFont systemFontOfSize:14.0];//得到系統字體

[myLable setFont:font];//設置文本對象的字體

2.drawRect方法
對於畫圖,你首先須要重載drawRect方法,而後調用setNeedsDisplay方法讓系統畫圖:
-(void)drawRect:(CGRect)rect;//在rect指定的區域畫圖

-(void)setNeedsDisplay;//讓系統調用drawRect畫圖

3.CoreGraphics API

UiKit所提供的畫圖類比較簡單,就是咱們上面所說的UIRectFill和UIRectFrame兩個方法。對於複雜的畫圖。你須要 使用CoreGraphics API.

步驟一:得到當前畫圖的上下文(CGContextRef) UIGraphicsGetCurrentContext(void);

步驟二:定義一個圖的軌跡(path),好比你要畫一個三角形,那麼,第一步就是畫出這個三角形的輪廓。可是並不在屏幕上顯示該圖。

步驟三:設置填充顏色

步驟四: 設置圖框顏色

步驟五:讓系統畫圖,這是你就看到了所化的圖形

十5、啓動界面的製做
iPhone開發實現splash畫面很是簡單,將一個UIImageView拖入LaunchScreen並設置約束,添加全屏的歡迎頁的圖片,再設置歡迎界面停留的時間。

在AppDelegate.m程序中,插入以下代碼:

1 - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
2     //–inserta delay of 5 seconds before the splash screendisappears–
3     [NSThread sleepForTimeInterval:5.0];
4     return YES;
5 }
相關文章
相關標籤/搜索