开发小技巧和常见错误

一、XCode的 Stack Trace,调试时抛出异常,定位到某一行代码

在Xcode调试程序的时候,总是会出现不知道错误在什么地方的问题,现在有一个办法,可以具体定位到错误行的代码,试一下吧!

操作如下:

1、在XCode界面中按cmd + 6快捷键,或者直接点击选项卡,跳到Breakpoint的tab

2、然后点击左下角的+号,增加一个Exception的断点,如下图所示。

3、接下来会出现一个“All Exception”的调试选项:

4、将鼠标放到上面,右击选择“Edit Breakpoint”,可以查看选项的具体内容如下:(不用做任何修改)


5、当异常出现时,会自动停在异常处,而不会抛出到UIApplicationMain。就可以定位到具体抛出异常的代码了。

二、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”的问题,这个其实不是什么问题,解决方案如下:

1、找到  XX-Prefix.pch 文件  注释掉下面的代码:

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

然后,重新编译项目

2、打开上面步骤中的注释

然后再次编译运行,发现竟然没有上面的错误了,问题解决。

三、在Linux/Mac下面删除所有的.svn文件

在使用svn管理代码的时候,如果提交原有的svn管理下的project到新的svn目录下时,需要先删除原有的文件夹里面的所有的.svn文件下面的所有内容,否则直接提交会导致失败。

注意:最好先拷贝一个新的项目,然后删除备份文件夹下面的.svn文件。以免原有的svn项目有未提交的代码,导致文件不能提交,造成丢失等。

下面这种方法可以简单的使用终端删除所有的.svn文件。

1、首先先定位到你的项目的目录文件下面,比如我的项目在桌面上的svnProject目录下面,则需要在终端执行如下命令:

 

1 ~ mac$ cd Desktop/svnProject/  

执行完毕之后,就处在当前的svnProject目录下面了。

2、再执行如下命令,就可以删除此目录下面的所有的.svn文件了

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

可以看到此目录下面的所有的.svn文件都被删除了 ,包含子目录中的.svn文件也被删除了。

3、接下来就可以使用此目录下面的项目,上传至svn了。

题外话:.svn文件通常是隐藏的,可以参考 苹果电脑MAC 在Finder里面显示隐藏文件方法 来显示Mac电脑下面隐藏的文件。

四、 苹果电脑MAC 在Finder里面显示隐藏文件方法

在终端里输入下面命令即可让它们显示出来。

  defaults write com.apple.finder AppleShowAllFiles -bool true

  如果想恢复隐藏,可以用这个命令:

  defaults write com.apple.finder AppleShowAllFiles -bool false

  注意:1、执行命令后需要重启 Finder 才能看到效果。

     2、不要乱动不懂的隐藏文件,可能会损坏你的系统。

  也可以直接用这软件实现隐藏:

  MacPilot

五、iOS如何使用第三方字体

1、从网上下载所需字体的TTF文件。将字体所对应的TTF文件拖入项目中。

2、然后在info.plist中添加一个新的键Fonts provided by application, NSArray类型的, 在其对应的item里面的string值为**.TTF,如图:

3、接下来就是要知道对应字体的名字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

4、现在可以知道文字包里面的字体名称了吧?接下来使用就可以咯:

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

注意:

文字的使用可是有版权问题的噢,程序中要想使用某些特殊的文字,必须得有版权哦,否则最好不要用,会有侵权问题。

六、ARC下NSNotificationCenter需要remove

 - (void) dealloc
2 {
3     //  [super dealloc] 千万不要画蛇添足   
4     [[NSNotificationCenter defaultCenter] removeObserver:self]; 
5 }

七、const or #define

下面是大家常见的两种定义优先选择第二种

#define PI 3.14159  //只预处理时进行符号替换,不推荐
const doulbe Pi=3.14159 //安全性高,和效率上推荐

 

 

八、常量字符串声明

Foo.h

extern NSString *const XXFooDidBarNotification;
 

Foo.m

NSString *const XXFooDidBarNotification =@"XXFooDidBarNotification”

九、调试的技巧

有没有用过下面的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]); 
  ...
}

十、注释技巧

  在代码中加注释时,如果以 // TODO: 或 // FIXME: 或者 // !!!: 或 // ???: 开头的话,此注释会出现在方法的下列列表里,方便日后跟踪。利用Xcode4中的自定义代码片段,可以用一个快捷键插入一个预先定义好的注释片段

十一、获取当前时间
 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
 
十二、读取和写入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" ];
 
十三、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);

十四、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),比如你要画一个三角形,那么,第一步就是画出这个三角形的轮廓。但是并不在屏幕上显示该图。

步骤三:设置填充颜色

步骤四: 设置图框颜色

步骤五:让系统画图,这是你就看到了所化的图形

十五、启动界面的制作
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 }
 
posted @ 2016-03-29 17:59  冬阳翱翔  阅读(156)  评论(0)    收藏  举报