IOS开发中的那些琐碎的小问题

整理了一个多月开发中的一些小问题,当然,本身遇到问题肯定还有更多,

比如类别的一些使用的技巧,协议格式的一些特殊字符,

同步于异步的网络处理的选择,数据的存储选择,类的设计。

因为其实大部分ios互联网应用的技术含量不会是很深奥,基本到后来发现就是对UI控件的一些需熟能生巧的应用,网络编程以及逻辑的处理,

更多的还有是一些经验和积累。

这边是几个早期的问题,也就是一个开发开始一个*拜中一些问题我还做记载,后面一个月进度匆忙,也就懒于记录

1.UILabel中显示多行时,自动换行。

[cpp] view plain copy
  1. label.numberOfLines =0;
  2. label.lineBreakMode = UILineBreakModeWordWrap;
  1. label.numberOfLines =0;
  2. label.lineBreakMode = UILineBreakModeWordWrap;

前提是该label设置的frame是足够大的。不支持滚动。

理论上不支持这么做,因为TextView控件相对来说更好

2.nil和release区别

nil和release的作用:
nil就是把一个对象的指针置为空,只是切断了指针与内存中对象的联系;
而release才是真正通知内存释放这个对象。

所以nil并没有释放内存,只有release才回真正释放内存。
再分析一下二者使用的先后顺序:
如果没有release就直接nil,那么虽然不会出错,却等于自己制造内存泄漏了,因为nil之后release就已经不起作用了。

相反,如果在使用接口对象时只仅仅release没有设置self.myOutlet =
nil,那么程序可能也不会报错,但却会十分不稳定、不健壮,很容易发生崩溃现象。

因为一个接口对象在release之后,给它所分配等内存就已经被释放了,如果释放之后系统再用到这个对象,那么程序就会crash。

如果释放之后把它的指针置为空,则即便后面的程序用到该对象,也不会崩溃。

3.获取当前时间和格式化

[cpp] view plain copy
  1. NSString *postTime;
  2.     NSDateFormatter *formatter = [[NSDateFormatteralloc] init];
  3.     [formatter setDateFormat:@“YYYYMMddhhmmss”];
  4.     postTime = [formatter stringFromDate:[NSDatedate]];<STRONG>
  5. </STRONG>
  1. NSString *postTime;
  2. NSDateFormatter *formatter = [[NSDateFormatteralloc] init];
  3. [formatter setDateFormat:@“YYYYMMddhhmmss”];
  4. postTime = [formatter stringFromDate:[NSDatedate]];

4.巧妙的运用宏,高效的预处理

5.关于版本控制工具Versions:Versions上FileMerger找不到路径的报错问题。

应用会提醒建议重装,说没有安装这个工具,但是在Xcode下我们又是能发现该应用已经装了的。
*后网上查了下说是Xcode版本升级问题,导致应用路径该了,当时versions默认对filemerge路径没改。
剛剛把 Xcode 升級到 4.3.2 發現 Versions 的文件對比功能無法使用了。因為 Xcode 自從 4.3 之後整體打包成一個App放到了 /Applications 下面,過去的 /Developer 整個被建議刪除掉了。
Versions 按照原來的路徑沒辦法找到 FileMerge.app 所以搞罷工。處理起來很簡單,去命令行執行
sudo /usr/bin/xcode-select -switch /Applications/Xcode.app/Contents/Developer

6.项目编译时一种常见格式报错

Undefined symbols for architecture i386:
“_OBJC_CLASS_$_ASIHTTPRequest”, referenced from:
objc-class-ref in ASIInputStream.o
_OBJC_CLASS_$_ASIFormDataRequest in ASIFormDataRequest.o
objc-class-ref in ASIFormDataRequest.o
objc-class-ref in ASINetworkQueue.o
objc-class-ref in ASIDownloadCache.o
objc-class-ref in NLNetHelper.o
“_OBJC_METACLASS_$_ASIHTTPRequest”, referenced from:
_OBJC_METACLASS_$_ASIFormDataRequest in ASIFormDataRequest.o
“_NetworkRequestErrorDomain”, referenced from:
-[ASIFormDataRequest addFile:withFileName:andContentType:forKey:] in
这是我们在引入第三方类库文件时,build后错误。比如引入_ASIHTTPRequest和SBJson时。
如果出现以上错误了,比较简单的方法就是。点击项目,–》build Phase s–》compile sources中,点击add后,我们能看到项目下的源文件,此时,建议把你能看到后缀为.m文件全add了~~。
后来发现同事引入时没没什么问题,经提醒发现一个一直被我忽略的问题,就是拖动文件进来时,一般我们是选了非引入而是copy一份,这个没问题,但是下面海域个选矿,addtarget。这个记得勾上,因为关系到项目的一些配置,我估计是就是这个原因。

7.ios客户端于java服务端交互关于null的的问题

在ios网络操作时解析json时,有时会有这样额一种情况: “myThing”:null;
而myThing根据情况分成:1,在有返回的时候是一个字典;2若无内容,返回null。
然后我们在客户端处理是需要判断是佛为null才能来做相应的解析(如果null依旧去解析这个自定则会报错),但是仅仅的一句 if(dic)并不试用。
必须[Dic  isEqual: [NSNull null]]

这个其实是指针空于内容空的一种区别。一般来说我们在判断指针空是用nil,而内容空则是NSNull

8.判断字窜A中是否包含字窜B

暂时没找到java中的包含函数
oc提供了一个rangeOfString。然后看length长度。

9.关于ViewController之间交互,数据的传递

在Android我们知道两个Activity之间可以使用bundle来传递,iOS中其实提供了很多解决方法.

但是后来发现*简单的一种就是,我们在第二个ViewController中申明一个这样的属性,

在第*个ViewController中初始化第二个vc后,设置进去要传递的数据就可以了~

当然,用一个全局或是单例类存放在某些情况下会很合适。

10.NSNotificationCenter的妙用和小技巧

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refeshLogin) name:@”login” object:nil];

消息的注册和监听,以及发送通知调用post发送然后监听处理。

我觉得善用这个类很美妙。