
Objective-C高效编程
文章平均质量分 84
大部分内容摘自《Objective-C 》高效编程的52个有效方法,还有《Objective-C高级编程》这本书。其中深入讨论了ARC,block和gcd,还有一些其他知识点,这些博文中融入了自己了观点,欢迎网友评论。
hherima
移动互联网,大有可为!APP开发经历:飞信、和4G、搜狐视频、56视频等项目。
展开
-
主线程 -[__NSDictionaryM objectForKey:] SEGV_ACCERR 类型的crash
项目中遇到一个偶现crash,如图:按道理-[__NSDictionaryM objectForKey:] 即便dict是nil或者key是nil都不会crash啊。查阅资料:有同学反馈NSMutableDictionary is not thread safe。先在demo中模拟一下场景:+ (NSMutableDictionary *)cacheDictionary{ static NSMutableDictionary *instance = nil; static.原创 2021-03-21 00:13:51 · 2492 阅读 · 3 评论 -
iOS常见崩溃以及总结
【转载】作者:乳猪啸谷链接:https://juejin.im/post/6844903688608153614用户在使用App的过程中,经常遇到闪退的情况,体验不太好,本文尝试探索引发闪退的原因,以及在遇到crash的情况下,尽可能的保持程序运行,并及时上报错误。一、crash类型1.OC层面的crash1.1 普通类型NSInvalidArgumentException:非法参数异常,传入非法参数导致异常,nil参数比较常见。 NSRangeException:下标越界导致的异常转载 2020-11-06 17:50:48 · 3950 阅读 · 0 评论 -
push和present 两种方式。viewWillDisAppear,viewDidDisAppear的顺序
一图胜万语原创 2020-05-26 16:49:50 · 1076 阅读 · 0 评论 -
NSNotificationCenter 如果name是空?是什么效果?
典型的NSNotificationCenter使用方法:[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged) name:kReachabilityChangedNotificatio原创 2020-05-11 10:15:08 · 592 阅读 · 0 评论 -
[UIView animateWithDuration:completion:]被卡主,延迟执行了completion:回调
视频项目中遇到一个bug,横屏播放视频时候,转到小屏后。页面卡主了,点击页面没效果。但是点击播放器可以响应。debug时候查看UI层级,发现:在转屏过程中,转屏动画没有执行完(动画的completion:)没有执行。导致一些View设置没有得到执行。 断断续续,查了几天发现是视频弹幕的动画引起的。这里写一下伪代码:[UIView animateWithDuration:^{ 暂停弹幕动画} completion:^{ View的设置}];弹幕动...原创 2020-05-11 10:03:33 · 2115 阅读 · 0 评论 -
iOS Hook系统类的办法,比如:UITextSelectionView
由于UITextSelectionView是系统的私有类,连头文件都没有。那么我们怎么hook它的方法呢。比如初始化方法initWithInteractionAssistant://步骤一 Method originEat = class_getInstanceMethod(NSClassFromString(@"UITextSelectionView"), ...原创 2020-04-22 17:13:16 · 1848 阅读 · 0 评论 -
UISlider 延迟调用touchesBegan,延迟调用valueChangeHandle。delay?
今天遇到一个体验问题。播放器的UISlider的thumbImage在拖拽后不是立即响应,而是等了0.3或0.5或1秒后才响应。(如何扩大thumbImage的响应区域,可百度)。如图所示: 虽然hitTest已经是UISlider了,但是,仍然登录0.x秒才执行touchesBegan:和valueChangeHandle:方法:2020-04-08 23:...原创 2020-04-08 23:57:34 · 688 阅读 · 0 评论 -
OC 对同一个方法进行多次交换(Method Swilzzling)
Method Swizzing主要用于在运行时将两个Method进行交换.例如:交换实例方法: Method originMethod = class_getInstanceMethod(target, originalSelector); Method swizzledMethod = class_getInstanceMethod(target, swizzledSele...原创 2019-10-21 13:19:25 · 1937 阅读 · 0 评论 -
iOS 多线程编程gcd全面系统认识
这两天在看《OC高级编程-多线程编程和内存管理》日本人写的那本,该书对arc,block和gcd有了更深层次的解读,非常不错。现在总结一下gcd相关的知识。有关arc和block的参考arc 参考block 网上很多博客都对gcd有过讲解,很多是对gcd的全局队列,主线程队列,创建队列等等,做了单方面的描述,不是很全面系统。下面我们将学习一下系统得gcd。本文主要分为下面几个要点,前几个好点比较好理解,最后可能理解起来有些费劲!● 什么是gcd,iOS为什么要用多线程● 创建线程,序列线程和原创 2014-08-27 11:35:42 · 3330 阅读 · 1 评论 -
__weak如何实现对象值自动设置为nil的
__weak 修饰符就像我们知道的那样__weak修饰符提供了如同魔法般的功能。● 若使用__weak修饰符的变量引用对象被废弃时,则将nil赋值给该变量● 使用附有__weak修饰符的变量,就是使用注册到autoreleasepool的对象。原创 2014-08-18 16:56:37 · 6665 阅读 · 1 评论 -
Effective Objective-C(第1-5条)熟悉Objective-C
Objective-C通过一套全新的语法,在C语言基础上添加了面向对象特性。OC的语法中频繁使用方括号,而且不吝于写出极长的方法名,这通常令许多人觉得此语言较为冗长。这是这样写出来的代码非常易读,只是C++和Java程序员不太适应。 OC语言学起来很快,但有很多微妙细节需要注意,而且还有许多容易为人所忽略的特性。另一方面,有些开发者并未完全理解或是容易滥用某些特性,导致写出来的代码难以维护,难以调试。本章讲解基础知识,后续各章语言及其相关架构的各个特定话题。原创 2014-08-10 15:03:28 · 2068 阅读 · 0 评论 -
Effective Objective-C(第6-10条)对象、属性、equalToString、关联对象
用Objective-C等面向对象语言编程时,“对象”(object)就是“基本构造单元”(building block),开发者可以通过对象来存储并传递数据。在对象之间传递数据并执行任务的过程就叫做“消息传递”(Messaing)。原创 2014-08-10 15:04:00 · 2229 阅读 · 0 评论 -
Effective Objective-C(第11-14条)动态绑定、objc_msgSend、消息转发机制
第11条:理解objc_msgSend的作用 在对象上调用方法是Objective-C中经常使用的功能。用Objective-C术语来说这叫做:“传递消息”(pass a message)。消息有“名称”(name)或者“选择子”(selector),可以接收参数,而且可能还有返回值。 由于Objective-C是C的超集,所以最好理解C语言的函数调用方式。C语言使用“静态绑定原创 2014-08-10 15:06:27 · 3912 阅读 · 1 评论 -
Effective Objective-C(第15-22条)接口与API设计、深拷贝、浅拷贝
近年来,开源社区与开源组件随着iOS开发而流行起来,我们经常使用别人的代码,别人也会看到你的代码。所以,我们要把代码写得清晰一些原创 2014-08-10 15:06:55 · 1939 阅读 · 0 评论 -
Effective Objective-C(第23-28条)类别、协议,代理,匿名对象、delegate
对象之间经常需要相互通信,而通信方式有很多。Objective-C开发者广泛使用一种名叫“委托模式”(Delegate Pattern)的编程设计模式来实现对象间的通信,该模式的主旨是:定义一套接口,某对象若想接收另一个对象的委托,则需遵从此接口,以便称为“委托对象”(delegate)。而这“另一个对象”则可以给其委托对象回传一些信息,也可以在发生相关联时间时通知委托对象。原创 2014-08-10 15:07:21 · 2732 阅读 · 0 评论 -
Effective Objective-C(第29-36条)内存管理篇,ARC、循环引用、引用计数
在OC这种面向对象语言里,内存管理是个重要概念。要像用一门语言写出内存使用效率较高且又没有bug的代码,就得掌握内存管理模型的种种细节。一旦理解这些规则,你就会发现,其实OC的内存管理没有那么复杂,再进入ARC之后就更为简单了。原创 2014-08-10 15:08:08 · 4047 阅读 · 0 评论 -
Effective Objective-C(第37-40条)block在栈上?在堆上?
OC中多线程编程的核心就是block与gcd。这虽然是两种不同的技术,但他们是一并引入的。block是一种可在C、C++及OC代码中使用的“词法闭包”(lexical closure),它极为有用,借此机制,开发者可将代码像对象一样传递,令其在不同环境(context)下运行。在block的范围内,它可以访问到其中的全部变量。 gcd是一种与block有关的技术,它提供了对线程的抽象,而这种抽象基于“派发队列”(dispatch queue)。开发者可将block排入队列中,有gcd负责处理所有调度原创 2014-08-10 15:08:45 · 3966 阅读 · 4 评论 -
Effective Objective-C(第41-46条)gcd大中枢派发、performSelector
OC中多线程编程的核心就是block与gcd。这虽然是两种不同的技术,但他们是一并引入的。block是一种可在C、C++及OC代码中使用的“词法闭包”(lexical closure),它极为有用,借此机制,开发者可将代码像对象一样传递,令其在不同环境(context)下运行。在block的范围内,它可以访问到其中的全部变量。 gcd是一种与block有关的技术,它提供了对线程的抽象,而这种抽象基于“派发队列”(dispatch queue)。开发者可将block排入队列中,有gcd负责处理所有调度原创 2014-08-10 15:08:59 · 1965 阅读 · 0 评论 -
Effective Objective-C(第47-52条)系统架构,foundation、for-in、NSTimer
第47条:熟悉系统框架 若是不了解系统架构所提供的内容,那么就可能会把其中已经实现的东西再写一遍。将一系列代码封装为动态库(dynamic library),并在其中放入描述其接口的头文件,这样做出来的东西就叫框架。然而iOS应用程序不允许在其中包含动态库。 开发者使用最对的是Foundation框架,像NSObject、NSArray、NSDictionary原创 2014-08-10 15:13:57 · 2384 阅读 · 0 评论