iOS开发日记(1)
一.关于UITextFile收起键盘的方法?
1、重载UIViewController中TouchBegin方法,执行[self.view endEditing:Yes];
2、直接执行[[UIApplication SharedApplication]sendAction:@selector(resignFirstReponder) to:nil forEvent:mil];用于获得当前UIViewController比较困难的时候
3、直接执行[[[UIApplication SharedApplication]KeuWindow]endEditing:YES];
4、相应控件的resginFistResponder
二、关于UIWebView知识
1、实现UIWebView与JavaScript相互调用需要调用UIWebView的-(NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script这个方法,也可以使用开源框架WebViewJavaScriptBridge
三、iOS内存管理
1、MRC下遵循“谁申请谁释放”,来避免循环引用的问题,尽量使用weak来声明变量。__bridge做类型转换
四、上下文相关知识
1、把系统默认的英文上下文菜单变为中文,用vim直接打开工程的Info.plist文件,在文件中增加以下内容:
CFBundleLocalizations
zh_CN
en
五、其他
1、iOS中所有的对象都一个isa指针来指向该类的对象
2、iPhone 5S以后苹果才有64位的处理器,引入Tagged Pointer后使APP运行更加流畅,并有3倍的访问速度提升,以及100倍的创建,销毁速度提升。(相比与32位处理器)
六、关于Block的知识
block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。
http://www.cocoachina.com/ios/20120514/4247.html
七、给一个对象添加方法和属性
1、通过继承这个对象来给这个对象添加属性和方法
2、通过分类可以对对象添加方法
3、通过runtime关联对象也可以添加方法和属性
//首先定义一个全局变量,用它的地址作为关联对象的key
static char associatedObjectKey;
//设置关联对象
objc_setAssociatedObject(target, &associatedObjectKey, @"添加的字符串属性", OBJC_ASSOCIATION_RETAIN_NONATOMIC);//获取关联对象
NSString *string = objc_getAssociatedObject(target, &associatedObjectKey);
NSLog(@"AssociatedObject = %@", string);
八、为什么UIView动画的回调可以用self
当 block 本身不被 self 持有,而被别的对象持有,同时不产生循环引用的时候,就不需要使用 weak self 了。最常见的代码就是 UIView 的动画代码,我们在使用 UIView 的animateWithDuration:animations方法 做动画的时候,并不需要使用 weak self,因为引用持有关系是:
UIView 的某个负责动画的对象持有了 block
block 持有了 self
因为 self 并不持有 block,所以就没有循环引用产生,因为就不需要使用 weak self 了
当动画结束时,UIView 会结束持有这个 block,如果没有别的对象持有 block 的话,block 对象就会释放掉,从而 block 会释放掉对于 self 的持有。整个内存引用关系被解除。
九、从CGContrextRef中取出NSData和UIImage
UIImage* zoomedImage = [[UIImage alloc] initWithCGImage:cgImage scale:1.0 orientation:UIImageOrientationLeft];
CGDataProviderRef provider = CGImageGetDataProvider(cgImage);
NSData *data = (__bridge_transfer NSData*)CGDataProviderCopyData(provider);
十、去除数组中重复的对象
NSArray *newArr = [oldArr valueForKeyPath:@“@distinctUnionOfObjects.self"];