文档章节

记录一下iOS开发中琐碎的点点_5

hell03W
 hell03W
发布于 2017/04/19 17:27
字数 1438
阅读 24
收藏 0

1. 删除tableView中cell报错问题

在UITableView中, 删除cell操作时候, 应该先把数据从数组中移除, 然后再删除cell, 否则会有报错:

self.tableView?.deleteRows(at: [indexpath], with: .automatic)

Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (5), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).

2. swift中的循环引用

详细文档: https://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapter2/16_Automatic_Reference_Counting.html

刚开始用swift开发, 项目做了一大半了, 突然想起来查看下内存, 一查不当紧, 发现了多出内存泄露, 控制器创建了十几个就是不会销毁, 内存不一会就涨了几兆, 仔细查看, 原来是对象间强引用造成内存泄露, 以前在oc时代, 使用weak关键字定义弱引用类型代理, 刚接触swift不知所措了, 就随手写了delegate方法, 结果就造成了今天的内存泄露, 解决起来也是很简单的, 将所有自定义的代理方法, 声明成weak类型的.

//定义代理时候只有继承自 `NSObjectProtocol` 的代理才能将其变量声明成weak类型
protocol SOCheapoilRuleDelegate: NSObjectProtocol {
    
}

//声明一个弱引用类型变量
weak var delegate: SOCheapoilRuleDelegate?

3. 代码控制跳转tabbar菜单栏不见了

问题就是, pop时候开启了动画, 如下所示, 关闭pop动画即可, 原因可能是, 开启动画时候, 因为跳转tabbar之后, 需要动画pop的页面没有展示, 所以动画做不了, 因此动画阻塞了tabbar的显示.

_ = navigationController?.popToRootViewController(animated: false)

4. swift项目, 同样要考虑内存泄露的问题

主要有两个容易引起内存泄露的问题, delegate和闭包, delegate使用weak声明, 闭包一定要加[unowned self]

5. UITextField系统自带键盘+监听textField变化的问题

也是挺简单的问题, 但是在项目中困扰了很久. 在输入的时候使用系统输入法, 输入很多拼音字符之后, 依次点击确认来确定要输入的字符, 出现问题是, 点击第一个之后后面所有的英文字符都变成了输入框中的文本.

问题: 在监听文本框变化的时候, 在每次变化都代码重置输入框内容, 这当然是我的bug了, 这个锅我背. 思考, 其它输入法比如百度输入法, 讯飞输入法是在一串数字完全输入之后才会填充到输入框中, 但是系统输入法是每个字符都会以待定的形式输入到输入框中, 因此系统输入法会造成这个问题, 而其它输入法不存在这个问题.

6. 友盟分享检测是否安装应用

let isSupport = UMSocialManager.default().platformProvider(with: UMSocialPlatformType(rawValue: 1)!).umSocial_isInstall!()
        if !isSupport {
            SVProgressHUD.showInfo(withStatus: "您的设备未安装安装微信")
            return
        }

7. WKWebView写入全局变量或者方法

let js = "window.yfqInfo = { getAppInfo: function() { return '\(strJsonNew)';} }"

        
let script = WKUserScript(source: js, injectionTime: .atDocumentStart, forMainFrameOnly: true)
webView?.configuration.userContentController.addUserScript(script)

8. 使用UIImage对象方法缩放图片显示比例

在swift中可以在扩展中提供一个可失败的构造器, 来实现图片按照不同的比例来显示, 项目中这样做是为了缩小MJRefreshGifHeader的GIF图片比例.

convenience init?(imgName: String, scale: CGFloat) {
        
        guard let imgPath = Bundle.main.path(forResource: imgName, ofType: nil),
            let imgData = NSData(contentsOfFile: imgPath)  else {
            return nil
        }
        
        self.init(data: imgData as Data, scale: scale)
    }

9.UserNotifications.framework在ios一下项目中兼容问题

把status由Required 修改成Optional,然后再运行就OK了, 其它类似的框架也可以这样处理.

10.测试print函数到底有多耗时

如下所示,在单元测试中的measure中测试代码执行速度, 一个赋值+一个print, 耗时在0.6s~0.7s之间, 但是入如果注释掉print函数, 则代码执行100000次的速度是0.0005s~0.0008s之间, 速度差1000倍.

self.measure {
            // Put the code you want to measure the time of here.
            var sum = 0
            for i in 0...100000 {
                sum += i
                print(sum)
            }
        }

11.查看崩溃日志

11.1 查看手机中的崩溃日志

打开xcode>window>devices>选择连接电脑的真机>View Device logs

11.2 查看上线app崩溃日志

参考:http://www.cocoachina.com/industry/20130725/6677.html

12. de了一个大bug

问题是这样的,app偶尔会出现, push和pop时候卡住, home退出到桌面再次打开就显示正常, 再次push和pop时候还是有问题. 这个问题困扰了我也有大半年了, 最终找到了问题所在, 问题的原因是手势pop的问题, 当在根控制器执行pop的操作之后就会出现这个问题. 猜测可能是打开pop手势的时候, 只要执行了pop操作就会触发UINavigationController做一些操作而不去判断当前控制器所在层级是否可以响应这个操作, 结果就出现了这个问题.

解决:在自定义的navi中设置pop手势代理等, 然后重写如下的方法, 在控制器将要出现时候, 判断控制器是否是根控制器, 如果是在根控制器则禁用pop, 非根控制器, 打开pop.

///控制器完全显示, 打开手势pop
    func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
        
        if viewControllers.first == viewController {
            interactivePopGestureRecognizer?.isEnabled = false
        }else{
            interactivePopGestureRecognizer?.isEnabled = true
        }
        
        navigationBar.sendSubview(toBack: navigationBar.overlay)
    }

13. iOS8和iOS10中检测用户是否授权通知

/// 检测系统是否授权消息推送通知
    func checkAuthorizationState() {

        if #available(iOS 10.0, *) {
            UNUserNotificationCenter.current().getNotificationSettings { (setting) in
                self.isAuthorized = (setting.authorizationStatus == .authorized)
            }
        } else {
            // Fallback on earlier versions
            isAuthorized = (UIApplication.shared.currentUserNotificationSettings?.types != .none)
        }
    }

© 著作权归作者所有

hell03W
粉丝 9
博文 145
码字总数 109892
作品 0
朝阳
程序员
私信 提问
iOS高仿QQ侧滑控件、下载框架、动画效果、扫一扫、颜色变化、K线图等源码

iOS精选源码 仿京东"加入购物车"转场动画(http://www.code4app.com/thread-28162-1-1.html) ColorTool(颜色转换)(http://www.code4app.com/thread-29256-1-1.html) Swift 专业版K线(http://w......

sunnyaigd
2018/04/17
56
0
《 iOS 应用逆向工程》作者沙梓社专访:运用逆向工程思维来优化自己的产品

小编语 本文为 DevLink 专访系列,本期采访嘉宾是 iDev 苹果开发者大会 iOS 逆向工程讲师——沙梓社。在即将到来的 iDev 大会上,他将和大家分享对逆向工程的理解,以此激发大家的思路和灵感...

DevLink
2016/10/21
192
1
2018 iOS 面试题大全(补充完整版)

原文地址:2018 iOS 面试题大全 由于原作者并没有继续更新,这里我转过来继续更新下 这个栏目将持续更新--请iOS的小伙伴关注! 1、iOS 应用导航模式有哪些? 2、iOS 中持久化方式有哪些? 3、...

Theendisthebegi
2018/11/15
0
0
iOS 8.2 beta 4 发布,新增与 Apple Watch 配对

苹果今天向开发者发布了 iOS 8.2 Beta 4测试版,距离第三个测试版发布相隔1个月的时间。距离 iOS 8.2 第一个测试版相隔两个月的时间。今天发布的新测试版编译号为 12D5461b,开发者可以通过 ...

oschina
2015/01/13
1K
1
使用 iOS 7 在更新应用时应该避免的 5 件事情

iOS 7的发布将移动手机的世界推向一个新的高潮,很多人认为ios 7是ios历史上影响最广泛的升级之一。显然,iOS 7为全世界几亿的用户提供了一个更加强大健壮的平台,并且,在短短的几周后,在A...

oschina
2013/07/30
4K
6

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部