iOS tips 2

2015-10-09 | 阅读

Xcode更新后,无法跳转和查看注释

本来默认有跳转功能,但是更新后一直都是Symbol not found,原因是工程的索引文件在更新后被破坏了,必须到~/Library/Developer/Xcode/DerivedData下把相应的工程的文件夹给删除就行了.删除之后再rebuild一次,就可以看到索引了.Xcode经常出一些莫名其妙的问题。

以NSString创建NSURL为空的情况

对一个URL直接使用以下方法创建:

NSURL* url = [NSURL URLWithString:urlRequest];

由于url中有中文或者其他字符的存在.会导致乱码,而是NSURL无法创建成功.所以应该如此创建:

NSURL * url=[[NSURL alloc] initWithString:[urlRequest stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

在静态库中使用category导致出错

在连接一个含有category的静态库时,往往会得到运行时错误 selector not recognized . 因为符号没有被加载到最终的编译结果中。默认情况下,库中的category是不会被加载, 库中的类,只有其类方法被调用时,才会被加载到最终的可执行文件中。

解决方法:

  1. 在打包静态库时,在配置中的Other Linker Flags上添加 -ObjC ,就将所有的category都暴露出去了.
  2. 在项目程序中使用-all_load 或者-force_load.

关于-all_load-force_load,对于前者是将所有库中代码都进行加载,而对于后者,在后添加一个包的路径,也就是只加载一个包的内容.类似下面这样写:

-force_load $(SRCROOT)/FenQiBao/Library/Webtrends/Webtrends.framework/Webtrends -force_load $(SRCROOT)/FenQiBao/Library/GestureIdentify/FrameWorks/ZLGestureIdentify.framework/ZLGestureIdentify

然后,对于-ObjC-all_load的区别,-ObjC是加载OC代码,而-force_load-all_load是加载全部代码.

OC中常用的”反射”机制

对于NSObject有以下常用方法:

// 判断是否是类或者类的子类
- (BOOL)isKindOfClass:(Class)aClass;
// 判断是否是该类的实例,不包括子类 
- (BOOL)isMemberOfClass:(Class)aClass;
// 判断是否实现该协议
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
// 判断实例是否能响应该方法.却是一个类方法
+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
// 检测该类或者实例能否处理某个方法,既有类方法也有实例方法.
-+ (BOOL)respondsToSelector:(SEL)aSelector;

反射机制:

由类名的字符串获得 类:

Class cls = NSClassFromString(@"ClassABCD");
id obj = [[cls alloc] init];

将获取类名字符串:

Class cls = [ClassABCD class];
NSString *className = NSStringFromClass(cls);

通过方法名的字符串实例化方法:

SEL selector = NSSelectorFromString(@"setName:");
[obj performSelector:selector withObject:@"name"];

将方法名转换为字符串:

NSString* selName = NSStringFromSelector(SEL);