swift ios8 xib崩溃发送通知为什么程序崩溃

在swift 中使用UIAlertView崩溃的问题
[问题点数:20分,结帖人edgeperson]
在swift 中使用UIAlertView崩溃的问题
[问题点数:20分,结帖人edgeperson]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。推荐这篇日记的豆列
······拿点儿喝的坐好,是时候讲讲我最喜欢的 bug 的故事了。
那是我第一份 IT 相关的工作:在一个生产重要医疗设备的厂商担任软件开发的暑期实习生。那些设备主要是麻醉给药系统和病患监控设备,后者就是在卧床患者旁边放着的发出“哔哔”声的那种盒子,上面会以图形方式显示患者的脉搏、血压、呼吸等等。如果心电图变成一条直线的话还会立刻召唤护士。当时的办公室里全是 2 米高的装着笑气的罐子,还有长着超级大胡子的嵌入式系统大拿,整屋子的人都在给各种设备准备文档,为了让它们通过 FDA 的认证。时不时还有人小声提到 10 年前没能在测试中发现的一个 bug,它导致了一台麻醉机在手术过程中间重启了。不用说,对于像我这种十几岁的新手,所有的生产系统肯定是不会让我们碰的。
(注:一氧化二氮(Nitrous Oxide),又称笑气,无色有甜味气体,是一种氧化剂,化学式N?O,在一定条件下能支持燃烧(同氧气,因为笑气在高温下能分解成氮气和氧气),但在室温下稳定,有轻微麻醉作用,并能致人发笑。)
不过他们还是给我安排了一份让人羡慕的工作,去测试一个在 1997 年听起来还十分时髦的原型项目:一个用 C++ 编写的服务器,它会监听患者监控设备的串口,然后把一些需要关注的事件转存到 SQL Server 数据库中,之后通过 CORBA 把数据发送到 Java Applet,于是医生或者相关人员就能通过互联网看到这个患者的状态了,它既能看到实时的数据,也能浏览之间的数据记录。帅气!只是那个时候我对这些语言和系统都一无所知!
接下来的几个星期就像杀猪一样的折腾,主要时间都花在了读懂让人头疼的 手册,还有超级普通的类型转换 bug,不过我终于让我的“辛普森”系统磕磕绊绊地跑起来了,它用“Homer”(注:辛普森一家里的老爸)来记录和提供数据,然后用“Bart”(注:辛普森一家里的熊孩子)来进行显示。这几个星期让我觉得 CORBA 复杂得让人想死、AWT 让人头疼欲裂(比如 GridBagLayouts,呕)、applet 慢得像只蜗牛,不过 Java 看起来倒还像是个挺不错的语言。不过还有个小麻烦:C++ 服务器时不时就会突然崩溃掉,然后我开始尝试去搞明白到底是为什么。
因为我监听的那台监控设备在另一间屋子里,所以我绝大部分的开发和测试都是通过手动的“演示”模式来完成的,比如在一个循环里模拟一次心脏停跳之类的,据我所知,我的服务器从来没在这个过程中宕机过。不过在我或者别人手动摆弄那些控制器的时候,它确实崩溃过,尤其是在实际机器上操作的时候,不过我想尽办法也没能找到一个方法能让它稳定重现,甭管怎么做都不行。我把所有事件日志都记录到磁盘上,想找到在崩溃之前到底发生了什么,不过我小心翼翼地按照事件序列精确地手动重复了每一次事件(比如:把过滤器设置为 X,把控制器旋钮向右拧三个刻度,点击按钮……),我在两间屋子里跑来跑去(因为我在摆弄患者监控设备的时候是看不见我电脑上的日志的),但始终都没能让崩溃重现。不管是什么“鬼事件”(对我就是这么叫它的),它肯定是在造成崩溃的同时还逃过了所有日志。是不是有什么串口 I/O 或者硬件问题中断了事件?难道是宇宙射线把我 PC 上的数据位给改变了?
我把整天整天的时间都用来尝试去重现这个错误,但是毫无结果,在经历了几个星期的挫折之后,我最后干脆在所有从串口收到事件和写入数据库的操作中间都加了 printf 语句,在这个过程中,我重新检查了每一行代码,然后终于逐渐见到了曙光。
当我创建数据库结构的时候,为了节省空间而犯了一个错误,一个新手常犯的错误:把时间戳当成主键了。所以如果两个事件在一个毫秒内发生的话,数据库就会抛出主键唯一性约束的异常(译注:SQL Server 的 datetime 类型的精度其实不是1毫秒,而是3.33毫秒)。我之前注意到这个问题了,不过我觉得这种情况非常罕见,而且只会在没那么重要的环境中发生(比如在鼓捣监控设备内部配置的时候),所以我只是加了个 catch 语句,在日志中写了一条警告信息,然后继续执行后面的操作。
但是!这是个老派的代码,记录日志使用 C 语言风格的代码编写的,把日志字符串记录到了一个长度为 80 个字符的缓冲区中。唯一性异常这个消息本身是个常量,而日志的时间戳是格式化的,也就是实用了完整的英文的星期拼写(),所以输出就类似于“Monday, July 17, :47.123”。最后就是因为英文里面星期几的拼写有个有意思的属性:
明白了吧?星期三(Wednesday),而且只在星期三的时候,如果有人在监控器配置那儿手动进行了一个特定操作的话,就会在同一毫秒内产生两个事件,于是导致数据库抛出异常,而这个异常的消息包括字符串结尾的终结符的话,则刚刚好 81 个字符,导致了 80 个字符的缓冲区溢出,把程序搞挂了!
在那之后,在所有需要使用的数据库表中,我都会确保去用一个专门的、自增的整数 ID 作为主键,然后用 ISO 格式(也就是 YYYY-MM-DD)而不是星期几来记录所有日志。这些年来,我学到了不管一个 bug 看上去多么随机和不可预测,如果你挖得足够深的话,总是能找到一个符合逻辑的解释,极少有真的“不相关”的错误,几乎都是你特么自己的错。
不过 Dave Baggett 的编程生涯中,。
文章出处:当前位置:
& Swift - 使用NSNotificationCenter发送通知,接收通知
Swift - 使用NSNotificationCenter发送通知,接收通知
发布:hangge
浏览:2076
1,通知(NSNotification)介绍
这里所说的通知不是指发给用户看的通知消息,而是系统内部进行消息传递的通知。要介绍通知之前,我们需要先了解什么是观察者模式。
观察者模式 (Observer):指一个对象在状态变化的时候会通知另一个对象。参与者并不需要知道其他对象的具体是干什么的 。这是一种降低耦合度的设计。常见的使用方法是观察者注册监听,然后在状态改变的时候,所有观察者们都会收到通知。&
在 MVC 里,观察者模式意味着需要允许 Model 对象和 View 对象进行交流,而不能有直接的关联。
Cocoa 使用两种方式实现了观察者模式: 一个是 Key-Value Observing (KVO),另一个便是本文要讲的Notification。
2,系统通知的注册和响应
比如我们想要在用户按下设备的home键,程序进入后台时执行某些操作。一种办法是在AppDelegate.swift里的applicationDidEnterBackground方法里执行。
除此之外,由于程序进入后台会发送 UIApplicationDidEnterBackgroundNotification 的通知,我们可以事先注册个监听这个通知的“观察者”来处理。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let notificationCenter = NSNotificationCenter.defaultCenter()
let operationQueue = NSOperationQueue.mainQueue()
let applicationDidEnterBackgroundObserver =
notificationCenter.addObserverForName(UIApplicationDidEnterBackgroundNotification,
object: nil, queue: operationQueue, usingBlock: {
(notification: NSNotification!) in
print("程序进入到后台了")
//如果不需要的话,记得把相应的通知注册给取消,避免内存浪费或奔溃
//notificationCenter.removeObserver(applicationDidEnterBackgroundObserver)
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
3,使用自定义的通知&
通知类型其实就是一个字符串,所以我们也可以使用自己定义的通知(同时也可以传递用户自定义数据)。
下面创建了两个观察者获取下载图片通知,同时收到通知后的处理函数内部添加了个3秒的等待。
--- ViewController.swift ---
import UIKit
class ViewController: UIViewController {
let observers = [MyObserver(name: "观察器1"),MyObserver(name: "观察器2")]
override func viewDidLoad() {
super.viewDidLoad()
print("发送通知")
NSNotificationCenter.defaultCenter().postNotificationName("DownloadImageNotification",
object: self, userInfo: ["value1":"", "value2" : 12345])
print("通知完毕")
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
--- MyObserver.swift ---
import UIKit
class MyObserver: NSObject {
var name:String = ""
init(name:String){
super.init()
self.name = name
NSNotificationCenter.defaultCenter().addObserver(self, selector:"downloadImage:",
name: "DownloadImageNotification", object: nil)
func downloadImage(notification: NSNotification) {
let userInfo = notification.userInfo as! [String: AnyObject]
let value1 = userInfo["value1"] as! String
let value2 = userInfo["value2"] as! Int
print("\(name) 获取到通知,用户数据是[\(value1),\(value2)]")
print("\(name) 执行完毕")
//记得移除通知监听
NSNotificationCenter.defaultCenter().removeObserver(self)
运行结果如下:
观察器1 获取到通知,用户数据是[,12345]
观察器1 执行完毕
观察器2 获取到通知,用户数据是[,12345]
观察器2 执行完毕
(通过运行可以看出,通知发送后的执行时同步的,也就是观察者全部处理完毕后,主线程才继续往下进行。)【求助】为什么这句语句会使应用程序崩溃?
[问题点数:40分,结帖人ask4vc]
【求助】为什么这句语句会使应用程序崩溃?
[问题点数:40分,结帖人ask4vc]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2011年11月 专题开发/技术/项目大版内专家分月排行榜第二2011年8月 专题开发/技术/项目大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 swift 崩溃 的文章

 

随机推荐