record_temp.mp4这样的视频怎么打开,录制视频生成的,nmake 不知道如何生成为什么无法打开?

随笔 - 504&
文章 - 1026&
trackbacks - 0
3112345678910111213141516171819202122232426272829303112345678910
子曾经曰过:编程无他,唯手熟尔!
留言簿(85)
随笔分类(648)
随笔档案(504)
Crytek's Offical Modding Portal
Game Industry
Welcome to AMD Developer Central
A guy who works on the game engine Gamebryo at Emergent Game Technologies.
Breaking news and the lastest jobs for European games developers
Emergent sales type guy
GameIndustry
搜索代码,搜索Loki::试试
a guy in America whose old hometown is in ShanDong Province
read books
Programmers
Qt的信息和资源,很全
中国人讨论Qt的地方
有“Qt简体中文文档“
貌似人气很高啊
好多QT控件,开源项目,哈哈,爽
用Qt和OpenGL实现的Qt控件库,3D的,震撼死了
一个正在挪威奥斯陆工作的中国软件工程师
积分与排名
阅读排行榜
评论排行榜
好不容易复现的宕机bug,结果不产生dump文件,让俺情何以堪啊!坑爹嘛!大部分情况还好,就是弹出这种“Runtime Error”框的时候,不产生dump文件,解决它!!!
很多软件通过设置自己的异常捕获函数,捕获未处理的异常,生成报告或者日志(例如生成mini-dump文件),达到Release版本下追踪Bug的目的。但是,到了VS2005(即VC8),Microsoft对CRT(C运行时库)的一些与安全相关的代码做了些改动,典型的,例如增加了对缓冲溢出的检查。新CRT版本在出现错误时强制把异常抛给默认的调试器(如果没有配置的话,默认是Dr.Watson),而不再通知应用程序设置的异常捕获函数,这种行为主要在以下三种情况出现。
(1)&&&&&&&调用abort函数,并且设置了_CALL_REPORTFAULT选项(这个选项在Release版本是默认设置的)。
(2)&&&&&&&启用了运行时安全检查选项,并且在软件运行时检查出安全性错误,例如出现缓存溢出。(安全检查选项&/GS&默认也是打开的)
(3)&&&&&&&遇到_invalid_parameter错误,而应用程序又没有主动调用
_set_invalid_parameter_handler设置错误捕获函数。
所以结论是,使用VS2005(VC8)编译的程序,许多错误都不能在SetUnhandledExceptionFilter捕获到。这是CRT相对于前面版本的一个比较大的改变,但是很遗憾,Microsoft却没有在相应的文档明确指出。
&&&&&&&之所以应用程序捕获不到那些异常,原因是因为新版本的CRT实现在异常处理中强制删除所有应用程序先前设置的捕获函数,如下所示:
&/* Make sure any filter already in place is deleted. */
&SetUnhandledExceptionFilter(NULL);
&UnhandledExceptionFilter(&ExceptionPointers);
解决方法是拦截CRT调用SetUnhandledExceptionFilter函数,使之无效。在X86平台下,可以使用以下代码。
#ifndef _M_IX86
&&&&&&&#error "The following code only works for x86!"
void DisableSetUnhandledExceptionFilter()
&&&&void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")),
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"SetUnhandledExceptionFilter");
&&&&if (addr)
&&&&&&&&&&&&&&unsigned char code[16];
&&&&&&&&&&&&&&int size = 0;
&&&&&&&&&&&&&&code[size++] = 0x33;
&&&&&&&&&&&&&&code[size++] = 0xC0;
&&&&&&&&&&&&&&code[size++] = 0xC2;
&&&&&&&&&&&&&&code[size++] = 0x04;
&&&&&&&&&&&&&&code[size++] = 0x00;
&&&&&&&&&&&&&&&DWORD dwOldFlag, dwTempF
&&&&&&&&&&&&&&VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
&&&&&&&&&&&&&&WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
&&&&&&&&&&&&&&VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);
在设置自己的异常处理函数后,调用DisableSetUnhandledExceptionFilter禁止CRT设置即可。
&&&&&&&上面通过设置api hook,解决了在VS2005上的异常捕获问题,这种虽然不是那么“干净”的解决方案,确是目前唯一简单有效的方式。
&&&&&&&虽然也可以通过_set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT), signal(SIGABRT, ...),&和_set_invalid_parameter_handler(...)&解决(1)(3),但是对于(2),设置api hook是唯一的方式。
前面介绍如如何用WinDBG 生成crash dump 《》,但是用户机器上通常不安装WinDBG, 而且多数用户也不知道怎么使用WinDBG。 所以最好是自己程序里面能够捕捉exception/crash,并且生成crash dump,然后通过网络传回到自己服务器。
捕捉exception 可以用API 函数&。生成crash dump 可以用DbgHelp.dll 里面的函数。
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI&SetUnhandledExceptionFilter( __in LPTOP_LEVEL_EXCEPTION_FILTER&lpTopLevelExceptionFilter&);
BOOL WINAPI&MiniDumpWriteDump( __in HANDLE&hProcess, __in DWORD&ProcessId, __in HANDLE&hFile, __in MINIDUMP_TYPE&DumpType, __in PMINIDUMP_EXCEPTION_INFORMATION&ExceptionParam, __in PMINIDUMP_USER_STREAM_INFORMATION&UserStreamParam, __in PMINIDUMP_CALLBACK_INFORMATION&CallbackParam&);
代码示例:
& VC++ Runtime Error,& 对不少朋友来说, 这是一个十分讨厌的错误提示,& 您可能不知道如何着手调试: 产生这个错误的原因是什么? 确实只有知道了产生这个错误的直接原因, 才能去调试这个错误.
&&&& 刚碰到这个错误的时候, 是发生在视频解码的时候,& 由于解码一直在工作状态,& 所以我也不知道如何去调试, 当出现这个错误之后, 我们大多数时候就忽略了, 想从其他地方解决, 提高稳定性, 甚至怀疑解码器的稳定性;& 后来, 我接触解码库之后,& 开始调试这样的错误, 刚开始这样的错误并不容易重现, 往往要几个小时,& 当这个错误重现之后,& 程序还是在运行的, 只是其中的某一个线程中断了执行,& 其中的这个线程弹出了 "VC++ Runtime Error" 这样的对话框, 如果你点击它, 则整个应用程序会直接退出. 为了调试, 我就不能点击这个对话框, 而是使用VC2005附件到进程, 然后再直接中断进程, 这个时候, 会有一个线程中断点就在对话框的消息循环中, 仔细查看堆栈, 发现了一个函数: msvcrt.dll!_abort() ,& 到这里是时候查看MSDN了:
&&&&& 函数名:&abort
  功 能: 异常终止一个进程
  用 法: void&abort(void);
&&&&&&In a single or multithreaded Windows-based application,&abort&calls the Windows MessageBox function to create a message box to display the message with anOK&button. When the user clicks&OK, the program aborts immediately.&
& & 我们的程序就是基于WINDOS窗口的多线程应用程序,& 调用了abort就会弹出对话框, 在release版本中, 就是一个确认对话框, 点击后程序就提示出错并退出.
&&& 在正常的程序里, 我们是不会调用abort的, 除非是遇到了严重的, 不能恢复的错误.& 那么到底这个abort是怎么被调用的呢, 我们自己写的代码显然是没有这个函数, 再仔细查看堆栈,& 发现是在一个C语言版本的开源库中.& 我们的程序是需要7*24小时运行的, 出现了解码异常应该要被我们忽略, 而不是应用程序崩溃. 开源的跨平台解码库是C语言写的,& 在出现了严重错误时, 就直接abort这也是可以理解的, 不过, 这样的程序在我们的代码中显然要避免.& 大哥, 现在都是什么年代了, 很多程序都是需要一直跑的, 我只好改的库的源代码来重新编译程序才能解决这个问题了, 该怎么改了, 如果去分析解码的逻辑, 我们没有专业的人才.& 我想就干脆从abort函数这里入手, 直接返回成功值, 但是这样对解码逻辑影响更大, 可能导致更大的错误,& 我想到了操作系统的异常机制, 由于我们是在WINDOWS平台上工作, 所以可以利用WINDOWS结构化异常,& 我们可取消abort调用, 在这里我们使用代码产生一个结构化异常(SEH), 结构化异常分为硬件异常和软件异常, CPU可以检查到内存非法访问和除零错误等异常, 那么我们就将abort替换成除零语句, 比如 int i = 10/0;
&&&&&当程序执行到这里的时候,& CPU会捕捉这个异常, 并提示用户, 我们可以在调用解码函数的地方, 增加SEH捕捉代码, 来捕捉这个错误, 那么程序就能忽略这个错误并继续执行了. 后来的事实也证明了这个错误的忽略对程序并没有什么明显的影响.&&怎么写这个捕捉代码呢, 操作系统支持的SEH捕捉代码块为 __try - __finally 块和 __try - __except 块, 而__try - __finnaly块就可以实现我们的功能.& 写到这里, 可能有朋友要说了, 我们平时见的最多的是try-catch语句,& 那么我要解释一下了, try-catch&是C++异常的处理方式,& 而__try-__finnaly是操作系统SEH异常处理方式.& 在C++语言的try-catch并不能捕捉操作系统结构化异常(比如CPU异常, 内存访问冲突, 除零错误等). C++异常只能捕获软件异常, 通常是调用throw而产生的异常, 比如MFC异常中常见的CException.&&
&&&&SEH异常和C++异常有本质的区别, SEH是操作系统提供的异常处理技术, 在任何支持该操作系统的编程语言中, 都可以使用, 而C++异常处理只能在编写C++代码时使用。然而, 应当知道WINDOWS的VC++编译器是使用操作系统结构化异常来实现C++异常的.& 也就是说, C++的try块在VC++下编译时, 会变成__try块,& C++的catch块会变成SEH的&__except块: catch测试则变成SEH异常过滤器, catch中的代码则变为__except中的代码. 事实上, C++的throw块, 在编译的时候也会变成SEH的RaiseException函数调用, 由c++异常变为SEH异常.
&&& __finnally的好处在于, 有时更详细的异常信息对我们没有更大帮助, 我们只需要捕获到异常并忽略它。上面提到C++异常在VC++里被转换成SEH异常, 那么在VC下使用try-catch是否能捕获硬件异常呢? 比如我们常见的 0x0000000C 不可读或写.& VC++编译器已经提供了支持:
&&&&& try&{;}& catch(...){;}&& 这样的语句就能够捕获所有异常:包括CPU异常, 以及C++异常;& 不过需要注意的是, 在VC6.0中, 是默认支持的. 但是在VC2005中,& 是默认不捕获CPU异常的. 区别在于一个C++编译选项/Eha&, 只有这个选项打开才能用上面的try-catch()捕捉SEH异常.
程序偶尔会出现:Microsoft Visual C++ Runtime Library Runtime Error!&Program: [APPPATH] Abnormal program termination同时带有红色叉叉的对话框。
打开VC,附加对应的进程,在线程选项卡里查找类似MessageBox的字样,找到的那个就是弹出对话框的线程,右键,转到线程,查看调用堆栈,一般就能找到问题了
根据刚才的函数调用堆栈,可以发现,这个框框是由abort间接产生的,根据查看abort的源码,可以发现,产生结果是有选项_WRITE_ABORT_MSG和_CALL_REPORTFAULT这两个标志决定的,这两个标志一个是产生如上所述的对话框,一个是产生那个常见的错误报告对话框。在msdn里,和abort相关的还有个函数_set_abort_behavior,可通过此函数,改变abort的行为。
还有个常见的错误框与此类似,是pure virtual function 就是纯虚函数的调用,它的过程与abort相类似。
测试例子:
//SEH的异常处理过滤器static LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExPtrs){&&& AfxMessageBox("glllll");&&& return EXCEPTION_EXECUTE_HANDLER;}void SignalHandler(int signal){&&& AfxMessageBox("Application aborting...\n");}HANDLEDWORD WINAPI ThreadProc(LPVOID lp){&&& // TODO: Add your control notification handler code here&&& //int a = 0;&&& //int b = 6 /&&& char* pBuffer = (char*) (int)(rand());&&& char szBuff[10];&&& //StrCpy(pBuffer, "Hello, Crash!");&&& //MessageBox(pBuffer);&&& //strcpy(pBuffer, szBuff);&&& //CloseHandle((HANDLE)handle);&&& //abort();&&& //throw bad_alloc("aaaaa");&&& //terminate();&&& RaiseException(0, 0, 0, NULL);&&& AfxMessageBox("good");&&& return 0;}const char p5 = 'a';const static char p6 = 'b';void CCrashTestDlg::OnBnClickedButton1(){&&& _set_abort_behavior( 0, _WRITE_ABORT_MSG);&&& _set_abort_behavior(0,& _CALL_REPORTFAULT);&&& SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);&&& typedef void (*SignalHandlerPointer)(int);&&& SignalHandlerPointer previousH&&& //previousHandler = signal(SIGABRT, SignalHandler);&&& //MessageBox("ddd", NULL);&&& //abort();&&& DWORD dwID = 0;&&& handle = CreateThread(NULL, 0, ThreadProc, handle, 0, &dwID);&&& CloseHandle(handle);&&& //WaitForSingleObject(handle, INFINITE);&&}
阅读(3645)
&re: 网游客户端弹出个“Runtime Error”不产生dump文件的解决办法[未登录]& 01:02&
很好,我也正在为这个问题犯愁。&&&&&&当前位置: &
【技巧】魅族手机屏幕电脑录制教程
编辑:chen
来源:网络
  4.4以前,的录屏都要通过获取ROOT权限和第三方录屏来实现。从4.4开始,屏幕录制被整合进了系统中,但是它是被隐藏在系统中,不能直接调用,而是需要在PC上通过命令行来调用。无需Root权限,简单几步就可以将/平板上的屏幕操作录制成视频。
  今天就给大家讲解一下如何在进行屏幕录制。
  录制步骤
  一.在电脑端安装驱动,然后在设置中的「开发人员选项」中开启「USB调试」。
  二.下载adb工具包,并将其解压缩到任意硬盘根目录(本文演示是放在C盘根目录)。由于屏幕录制功能默认是隐藏的,因此需要 ADB 工具予以协助。
  三.录制开始
  1)在PC上「WIN+R」,输入CMD并回车,打开命令行。
  2)输入你存放的目录(例如:&cd c:\&)回车。
  3)输入cd adb,切换到ADB工具文件夹。
  4)输入adb shell,测试是否可以正常连接。若显示 shell@XX:/ $(XX为你的机型名,例如 shell@mx4:/ $),则连接正常,按「Ctrl键+C」退出测试。
  注意:输入命令后若提示 error:device not found ,则是说明,驱动没装好,重复第一步骤。
  四.输入adb shell screenrecord /sdcard/XXX.mp4 (XXX为视频文件名,可自定义),开始录制屏幕,视频格式为mp4,存放到sd卡中,默认录制时间为180s,中途可按「Ctrl键+C」停止录制。
  注意事项:
  1. 输入 --time-limit N,限制视频录制时间为N秒。如果不限制,默认180秒。
  2. 输入 --size N*N,限制录制视频分辨率为N*N。如果未指定,默认使用的分辨率。
  3.输入 --bit-rate,指定视频的比特率为6Mbps。如果不指定,默认为4Mbps。
  4.某些设备可能无法直接录制,原因是分辨率太高。如果遇到此类问题,系统将自行指定较低的分辨率。
  5.不支持录制过程中屏幕旋转,如果录制过程中旋转,有可能画面被切断。
  6.无法同步录制音频。
【上一篇】
【下一篇】
推荐阅读:
看完这篇文章有何感觉?
苹果应用推荐
PP助手准备为您下载应用
未越狱版:鳄鱼小顽皮爱洗澡
如果在10秒后下载任务还没有开始,请下载并安装:
下载步骤如下:Swift 视频录制之调用摄像头录像,并保存到系统相册例子-ios7教程-手机开发-壹聚教程网Swift 视频录制之调用摄像头录像,并保存到系统相册例子
下面我们来看一篇关于Swift 视频录制之调用摄像头录像,并保存到系统相册例子,这个是开发时的入门教程,具体的如下。
1,技术介绍
(1)AVFoundation.framework 框架提供了 AVCaptureSession 类。使用它可以实现视频捕获功能。
(2)使用 AVCaptureVideoPreviewLayer 可以将摄像头拍摄的画面实时显示在 ViewController 上。
(3)对于捕获到的视频,我们使用 AVCaptureMovieFileOutput 将其输出到文件中。
2,下面实现一个录像功能
(1)点击&开始&按钮,开始录制视频。默认先保存到 Documents 目录下,命名为 temp.mp4。
(2)点击&停止&按钮,停止视频录制。将录制好的录像再转存到系统照片库中。
3,效果图如下:
4,样例代码
import UIKit
import AVFoundation
import Photos
class ViewController: UIViewController , AVCaptureFileOutputRecordingDelegate {
&&& //视频捕获会话。它是input和output的桥梁。它协调着intput到output的数据传输
&&& let captureSession = AVCaptureSession()
&&& //视频输入设备
&&& let videoDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
&&& //音频输入设备
&&& let audioDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeAudio)
&&& //将捕获到的视频输出到文件
&&& let fileOutput = AVCaptureMovieFileOutput()
&&& //开始、停止按钮
&&& var startButton, stopButton : UIButton!
&&& //表示当时是否在录像中
&&& var isRecording = false
&&& override func viewDidLoad() {
&&&&&&& super.viewDidLoad()
&&&&&&& //添加视频、音频输入设备
&&&&&&& let videoInput = try! AVCaptureDeviceInput(device: self.videoDevice)
&&&&&&& self.captureSession.addInput(videoInput)
&&&&&&& let audioInput = try! AVCaptureDeviceInput(device: self.audioDevice)
&&&&&&& self.captureSession.addInput(audioInput);
&&&&&&& //添加视频捕获输出
&&&&&&& self.captureSession.addOutput(self.fileOutput)
&&&&&&& //使用AVCaptureVideoPreviewLayer可以将摄像头的拍摄的实时画面显示在ViewController上
&&&&&&& let videoLayer = AVCaptureVideoPreviewLayer(session: self.captureSession)
&&&&&&& videoLayer.frame = self.view.bounds
&&&&&&& videoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
&&&&&&& self.view.layer.addSublayer(videoLayer)
&&&&&&& //创建按钮
&&&&&&& self.setupButton()
&&&&&&& //启动session会话
&&&&&&& self.captureSession.startRunning()
&&& //创建按钮
&&& func setupButton(){
&&&&&&& //创建开始按钮
&&&&&&& self.startButton = UIButton(frame: CGRectMake(0,0,120,50))
&&&&&&& self.startButton.backgroundColor = UIColor.redColor();
&&&&&&& self.startButton.layer.masksToBounds = true
&&&&&&& self.startButton.setTitle(&开始&, forState: .Normal)
&&&&&&& self.startButton.layer.cornerRadius = 20.0
&&&&&&& self.startButton.layer.position = CGPoint(x: self.view.bounds.width/2 - 70,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& y:self.view.bounds.height-50)
&&&&&&& self.startButton.addTarget(self, action: #or(onClickStartButton(_:)),
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& forControlEvents: .TouchUpInside)
&&&&&&& //创建停止按钮
&&&&&&& self.stopButton = UIButton(frame: CGRectMake(0,0,120,50))
&&&&&&& self.stopButton.backgroundColor = UIColor.grayColor();
&&&&&&& self.stopButton.layer.masksToBounds = true
&&&&&&& self.stopButton.setTitle(&停止&, forState: .Normal)
&&&&&&& self.stopButton.layer.cornerRadius = 20.0
&&&&&&& self.stopButton.layer.position = CGPoint(x: self.view.bounds.width/2 + 70,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& y:self.view.bounds.height-50)
&&&&&&& self.stopButton.addTarget(self, action: #selector(onClickStopButton(_:)),
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& forControlEvents: .TouchUpInside)
&&&&&&& //添加按钮到视图上
&&&&&&& self.view.addSubview(self.startButton);
&&&&&&& self.view.addSubview(self.stopButton);
&&& //开始按钮点击,开始录像
&&& func onClickStartButton(sender: UIButton){
&&&&&&& if !self.isRecording {
&&&&&&&&&&& //设置录像的保存地址(在Documents目录下,名为temp.mp4)
&&&&&&&&&&& let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .UserDomainMask, true)
&&&&&&&&&&& let documentsDirectory = paths[0] as String
&&&&&&&&&&& let filePath : String? = &\(documentsDirectory)/temp.mp4&
&&&&&&&&&&& let fileURL : NSURL = NSURL(fileURLWithPath: filePath!)
&&&&&&&&&&& //启动视频编码输出
&&&&&&&&&&& fileOutput.startRecordingToOutputFileURL(fileURL, recordingDelegate: self)
&&&&&&&&&&&&
&&&&&&&&&&& //记录状态:录像中...
&&&&&&&&&&& self.isRecording = true
&&&&&&&&&&& //开始、结束按钮颜色改变
&&&&&&&&&&& self.changeButtonColor(self.startButton, color: UIColor.grayColor())
&&&&&&&&&&& self.changeButtonColor(self.stopButton, color: UIColor.redColor())
&&& //停止按钮点击,停止录像
&&& func onClickStopButton(sender: UIButton){
&&&&&&& if self.isRecording {
&&&&&&&&&&& //停止视频编码输出
&&&&&&&&&&& fileOutput.stopRecording()
&&&&&&&&&&&&
&&&&&&&&&&& //记录状态:录像结束
&&&&&&&&&&& self.isRecording = false
&&&&&&&&&&& //开始、结束按钮颜色改变
&&&&&&&&&&& self.changeButtonColor(self.startButton, color: UIColor.redColor())
&&&&&&&&&&& self.changeButtonColor(self.stopButton, color: UIColor.grayColor())
&&& //修改按钮的颜色
&&& func changeButtonColor(target: UIButton, color: UIColor){
&&&&&&& target.backgroundColor = color
&&& //录像开始的代理方法
&&& func captureOutput(captureOutput: AVCaptureFileOutput!,
&&&&&&&&&&&&&&&&&&&&&& didStartRecordingToOutputFileAtURL fileURL: NSURL!,
&&&&&&&&&&&&&&&&&&&&&& fromConnections connections: [AnyObject]!) {
&&& //录像结束的代理方法
&&& func captureOutput(captureOutput: AVCaptureFileOutput!,
&&&&&&&&&&&&&&&&&&&&&& didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!,
&&&&&&&&&&&&&&&&&&&&&& fromConnections connections: [AnyObject]!, error: NSError!) {
&&&&&&& var message:String!
&&&&&&& //将录制好的录像保存到照片库中
&&&&&&& PHPhotoLibrary.sharedPhotoLibrary().performChanges({
&&&&&&&&&&& PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(outputFileURL)
&&&&&&&&&&& }, completionHandler: { (isSuccess: Bool, error: NSError?) in
&&&&&&&&&&&&&&& if isSuccess {
&&&&&&&&&&&&&&&&&&& message = &保存成功!&
&&&&&&&&&&&&&&& } else{
&&&&&&&&&&&&&&&&&&& message = &保存失败:\(error!.localizedDescription)&
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& dispatch_async(dispatch_get_main_queue(), {
&&&&&&&&&&&&&&&&&&& //弹出提示框
&&&&&&&&&&&&&&&&&&& let alertController = UIAlertController(title: message,
&&&&&&&&&&&&&&&&&&&&&&& message: nil, preferredStyle: .Alert)
&&&&&&&&&&&&&&&&&&& let cancelAction = UIAlertAction(title: &确定&, style: .Cancel, handler: nil)
&&&&&&&&&&&&&&&&&&& alertController.addAction(cancelAction)
&&&&&&&&&&&&&&&&&&& self.presentViewController(alertController, animated: true, completion: nil)
&&&&&&&&&&&&&&& })
&&&&&&& })
上一页: &&&&&下一页:相关内容

我要回帖

更多关于 自动生成temp文件 的文章

 

随机推荐