经验总结

转载:http://blog.csdn.net/allison162004/article/details/22695829

1、所有的UI操作,都要切换到主线程中进行.否则,会发生莫名其妙的错误.

2、在主线程中,runloop默认是开启状态的。非主线程中,如果要用到runloop,必须手动开启runloop。

3、对于常见的EXEC_BAD_ACCESS,EXC_BAD_INSTRUCTION,错误,一般都是因为访问已经被release的对象造成的。尤其是在一个线程中访问另外一个线程的autorelease库中的对象,尤其要注意此类问题。

4、严格遵守iphone 内存管理手册,对于不是由你创建的对象,不要越权release,否则,可能会导致程序crash.有时,一些看起来非常严重的bug,在经过N过次努力,多种思路尝试fix之后,再回头分析bug产生的原因,你会发现,造成这个严重bug的原因,很可能是你违反了一个众所周知的规则引起的.这个规则你非常清楚,熟悉,但就是在coding的时候,稍不留神违反了它.于是就带来了灾难性后果.

5、除了面向对象的cocoa外,iphone编程不要忘记非面向对象的Core Foundation。 面向对象库里很多没有的功能,可以尝试在Core Foundation里找找。披如:RSA算法,MD5算法,SHA1算法,AES加密算法等,cocoa对象库里并没有相应的实现,但在core foundation里,均有相应的实现。

6、NSString类里没有的字符串编码GBK,GB2312,GB18030等,在CoreFoundation里,能找到相应的编码。建立socket连接,获得输入流和输出流时,也需要使用Core Foundation里的CFNetwork api。等等。

7、通过设置NSZombieEnabled参数,有非常有效帮助解决内存释放错误。

在消除某个对象时,如果为该对象设置了delegate,则需要先将delegate设成nil,这是一种良好的代码习惯。

8、在3.0 的Simulator上使用Instruments 检测内存泄漏时,无法看到函数名,只能看到一些地址指针.在3.1,3.1.2,3.1.3的simulator都正常,能够正常地看到是在哪个函数中存在的内存泄漏.

通过Nib文件加载viewcontroller的各种UI控件时时,在viewDidLoad函数里,viewController的控件才能使用。在viewcontroller的构造函数里,nib里的控件都还没有完成链接构造呢。

9、iPhone程序崩溃不要着急。可以结合使用Console和objc_exception_throw可以快速定位根源所在。

转:点击打开链接

10、键盘上的斜杠键坏掉了,怎么样用快捷键进行注释呢?

首先在Xcode中注释的默认快捷键为:command+/;

其次可以自行修改快捷键:Xcode>Preferences...>Key Bindings,如下图

11、Xcode中的导航区域关闭了,如何调出来?如下图:

在工具栏的右侧有3个View选择按钮,选择第一个,左侧的导航区域就会出现,如下图中红框选中区域:

对于Xcode编程环境的讲解,推介一本书”《iOS游戏开发入门经典》,清华大学出版社出版,刘凡译“,此书的第二章有很详细的讲解。

12、Xcode中的工具栏不见了,退出Xcode后再次进来还是没有,怎么调出来呢?如下图:

如果如果工具栏可见,上图蓝色选中区域为Hide Toolbar,如果不可见,则为Show Toolbar。

4、一个View中,有一张背景图,还有几个Label与Button,但是运行时只显示背景图,没有显示Label和Button。

后来发现是背景图放在了最上层,把其他内容给挡住了。

我在这里说一下背景图的设置,我知道的有两种方式:

  1)写代码:[self.view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"bg"]]];

  2)直接拖图片到xib的View上,不过图片一定要放在view的最底层,如下图:

  

13、怎么修改UITextField的高度?

UITextField默认的高度是没办法修改的,不过可以修改一下Border Style,如下图除了最后一种(默认)不可修改高度以外,其他三种都可以。

一般在项目中,UITextField的边框都会由UI来设计,所以选择第一种无边框即可。

6、在头文件中写如下代码时,在实现文件中调用的是哪一个blue?

1 @interface testController:UIViewController
2 {
3     buleController *bule;
4 }
5 property(nonatomic, strong) buleController *bule;

  1) 直接 写 bule 的时候 是调用的@interface testController:UIViewController { buleController *bule; }这里边的blue;

  2) 写 _bule 与 self.bule 的时候,调用的是 property(nonatomic, strong) buleController *bule;

  _bule 的写法与@interface testController:UIViewController { buleController *bule; }调用这里边的blue类似

  self.bule 是调用的 property(nonatomic, strong) buleController *bule; 的get、set方法

14、代码样式发生了变化,默认为Basic,根据个人喜好,重设为Default,如下图所示:

设置前与设置后的对比图:

设置前

设置后

也可以根据自己的喜好设置成别的。

15、.xib文件上的视图没有自动显示虚拟边框,为了方便对其,需要手动设置一下,设置方式Editor -> Canvas -> Show Bounds Rectangles,如下图所示:

设置前与设置后的对比图:

设置前

设置后

暂时就遇到这些问题,如果有新设置,再补上。以下部分是一些其他问题。

9.1、UIBarButtonItem 和 NavigationItem 的区别是什么?

UIBarButtonItem 包含在 NavigationItem里边, 就是导航条左右的那些按钮。

NavigationItem 是一个容器,它可以容纳左右按键、返回键与标题视图等。

9.2、[self.navigationBar addSubView:lable]; 和 self.navigationItem.titleView=label; 这两个等价吗?

这个不做回答,大家试一试就知道啦。遇到问题,多练习,多写代码,多试两遍就出来了,记忆还深刻呢。

10、如何在app的icon左上角显示圆形背景的数字?

在AppDelegate.m中的applicationDidEnterBackground:方法中现实,如下

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <span style="background-color: rgb(255, 255, 255);">/* 
  2.  说明:当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可 
  3.  **/  
  4. - (void)applicationDidEnterBackground:(UIApplication *)application  
  5. {  
  6.      [[UIApplication sharedApplication] setApplicationIconBadgeNumber:5];  
  7. }</span>  

11、NSClassFromString 类如何使用?

NSClassFromString是一个很有用的东西,尤其在进行iPhone toolchain的开发上。

正常来说,

id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init];

id myObj = [[MySpecialClass alloc] init];

是一样的。但是,如果你的程序中并不存在MySpecialClass这个类,下面的写法会出错,而上面的写法只是返回一个空对象而已。

因此,在某些情况下,可以使用NSClassFromString来进行你不确定的类的初始化。

比如在iPhone中,SKStoreProductViewController 可能就会出现这种情况,所以在你需要使用SKStoreProductViewController时,

最好使用:[[NSClassFromString(@"SKStoreProductViewController") .....]]

而不要直接使用 [SKStoreProductViewController ...]这种写法,因为 SKStoreProductViewController 在iOS6以下的版本并不支持。

NSClassFromString的好处是:

a 弱化连接,因此并不会把没有的Framework也link到程序中。

b 不需要使用import,因为类是动态加载的,只要存在就可以加载。因此如果你的toolchain中没有某个类的头文件定义,而你确信这个类是可以用的,那么也可以用这种方法。

12、iPhone来电的时候背后的闪光灯不停的闪

设置里面选通用,然后选辅助功能,然后关闭LED闪烁就可以了。

13、TBXML 如何遍历指定元素?

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <span style="background-color: rgb(255, 255, 255);">/** 
  2.  TBXML 解析xml 
  3.  element : 遍历指定的元素 
  4.  */  
  5. - (void) traverseElement:(TBXMLElement *)element {  
  6.     do {  
  7.         // 显示XML元素名称  
  8.         NSLog(@"%@",[TBXML elementName:element]);  
  9.               
  10.         // 获取到当前节点的第一个属性  
  11.         TBXMLAttribute * attribute = element->firstAttribute;  
  12.               
  13.         // 如果属性是有效的  
  14.         while (attribute) {  
  15.             // 在log窗口中显示属性的名称和值  
  16.             NSLog(@"%@->%@ = %@",[TBXML elementName:element],[TBXML attributeName:attribute], [TBXML attributeValue:attribute]);  
  17.                   
  18.             // 获取下一个属性  
  19.             attribute = attribute->next;  
  20.         }  
  21.               
  22.         // 递归遍历下一个子元素  
  23.         if (element->firstChild) [self traverseElement:element->firstChild];  
  24.           
  25.     // 获取同级元素  
  26.     } while ((element = element->nextSibling));  
  27. }</span>  

14、如何取消UITextAlignmentCenter的警告呢?烦死人了...   如下图:

修改UITextAlignmentCenter 为 NSTextAlignmentCenter

15、设置App启动页,如下图:

启动页图片分为3中像素:320*480、640*960、640*1136。

首先拖动图片到上图3中相应的位置,然后在工程的AppDelegate.m中的下列方法中设置:

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <span style="background-color: rgb(255, 255, 255);">/* 
  2.  说明:当程序载入后执行 
  3.  **/  
  4. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
  5. {  
  6.     //延时3秒,以便用户看清楚启动页  
  7.     [NSThread sleepForTimeInterval:3.0];  
  8.       
  9.     // 添加启动页  
  10.     UIImageView *splashScreen = [[UIImageView alloc] initWithFrame:self.window.bounds];  
  11.     if (iPhone5) {  
  12.         splashScreen.image = [UIImage imageNamed:@"Default-568h"];  
  13.     }else{  
  14.         splashScreen.image = [UIImage imageNamed:@"Default"];  
  15.     }  
  16.     [self.window addSubview:splashScreen];  
  17.       
  18.     // 启动页渐变效果  
  19.     [UIView animateWithDuration:0.5 animations:^{  
  20.         CATransform3D transform = CATransform3DMakeScale(1.01.01.0);  
  21.         splashScreen.layer.transform = transform;  
  22.         splashScreen.alpha = 0.0;  
  23.     } completion:^(BOOL finished) {  
  24.         [splashScreen removeFromSuperview];  
  25.     }];  
  26.       
  27.     [self.window makeKeyAndVisible];  
  28.       
  29.     return YES;  
  30. }</span>  

上述代码片段中,iPhone5是一个宏定义,如下:

#define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)

16、点击背景视图,收起输入法。

在 - (void)viewDidLoad 中添加如下代码:

// 设置 self.view GestureRecognizer
    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleBackgroundTap:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];

然后,编写 handleBackgroundTap: 方法

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <span style="background-color: rgb(255, 255, 255);">/* 
  2.  点击背景时关闭键盘 
  3.  **/  
  4. -(void)handleBackgroundTap:(UITapGestureRecognizer *)sender{  
  5.     [self.userName resignFirstResponder];  
  6.     [self.userPassword resignFirstResponder];  
  7. }</span>  

17、在ARC工程中使用非ARC文件时的编译设置:添加: -fno-objc-arc 方式如下。

18、获取字符串内所有匹配子字符串。

方法一:

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. NSString *string1=@"abcdefabcdefabcdefabcdefbcd";  
  2. NSString *string2=@"bcd";  
  3. NSArray *array=[string1 componentsSeparatedByString:string2];  
  4. NSMutableArray *arrayOfLocation=[NSMutableArray array];  
  5.   
  6. int d=0;  
  7. for (int i=0; i<array.count-1; i++) {  
  8.     NSString *string = array[i];  
  9.     NSNumber *number = [NSNumber numberWithInt:d += string.length];  
  10.     d += string2.length;  
  11.     [arrayOfLocation addObject:number];  
  12. }  
  13.   
  14. NSLog(@"%@", arrayOfLocation);  

2014-05-01 16:56:10.085 Test[635:70b] (

    1,

    7,

    13,

    19,

    24

)

方法二:

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. NSString *str = @"abcdefabcdefabcdefabcdefbcd";  
  2. NSString *copyStr = str;  
  3.   
  4. while ([copyStr rangeOfString:@"bcd"].location != NSNotFound) {  
  5.       
  6.     NSRange  range  = [copyStr rangeOfString:@"bcd"];  
  7.     NSLog(@"location:%d", range.location);  
  8.     copyStr = [copyStr stringByReplacingCharactersInRange:NSMakeRange(range.location, range.length) withString:@"XXX"];  
  9. }  

2014-05-01 16:56:10.083 Test[635:70b] location:1

2014-05-01 16:56:10.084 Test[635:70b] location:7

2014-05-01 16:56:10.084 Test[635:70b] location:13

2014-05-01 16:56:10.085 Test[635:70b] location:19

2014-05-01 16:56:10.085 Test[635:70b] location:24


参考:UIImageController使用的问题

解决UITableView中Cell重用机制导致内容出错的方法总结

iOS开发之Objective-C与JavaScript的交互



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值