扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
创建信号量的方式:
目前创新互联已为近1000家的企业提供了网站建设、域名、虚拟空间、网站改版维护、企业网站设计、苍南网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
(1)dispatch_semaphore_creat SignalCount = dispatch_semaphore_creat(10).
这个地方后面的这个10,是一个整数,可以是1,2,3,。。。表示在信号等待的时候,下一次收到的的信号量,说白了,就是这个数字控制的最大并发数。
(2)dispatch_semaphore_signal( ),这是一句表示信号通知。表示在信号等待的时候,收到的下一个信号量。一般是一个“信号量对象”。
(3)dispatch_semaphore_wait(参数一,参数二 ),这一句表示信号等待。
一般参数一会放一个信号对象,就是我们建立的那个,如果这个对列的信号量小于0的时候,就会一直等待下去。
参数二的值一般是 DISPATCH_TIME_FOREVER 和 DISPATCH_TIME_NOW
下面我们写一段代码来说明一下。(注:当然是参考别人的)
这个地方,解释一下,新建一个信号量为10的对象,就是将队列的最大并发数控制在10。
第一次打印的结果是 0,1,2,3,4,5,6,7,8,9。十个数字。
最关键的是dispatch_semaphore_signal(semphore),如果打印完第一轮十个数字,不再进行信号通知的话,线程就永远阻塞下去咯。剩下的10~99就不会再打印下去。
(注:以上是看了一个大神地思路以后,自己摆弄了一下,然后给大家解释一下,感谢那位大神,有些公司去面试的时候,会问NSOperation这个类通过调用setMaxConcurrentOperationCount这个方法设置最大的并发数,多线程技术GCD可以吗?答案是可以的,还有之前看过另外一个大神的,通过信号量控制,将异步的线程变成同步线程的,有兴趣的同学可以去参阅以下)。
线程的不安全是由于多线程访问和修改共享资源而引起的不可预测的结果。
ios多线程开发中为保证线程的安全常用到的几种锁: NSLock 、 dispatch_semaphore 、 NSCondition 、 NSRecursiveLock 、 @synchronized 。
WEAKSELF typeof(self) __weak weakSelf = self;
NSLock 是OC层封装底层线程操作来实现的一种锁,继承NSLocking协议。不能迭代加锁,如果发生两次lock,而未unlock过,则会产生死锁问题。
以车站购票为例,多个窗口同时售票(同步),每个窗口有人循环购票:
原子操作
原子操作是指不可打断的操作,也就是说线程在执行操作的过程中,不会被操作系统挂起,而是一定会执行完,
变量属性Property中的原子定义
一般我们定义一个变量@property (nonatomic ,strong)NSLock *lock;nonatomic:非原子性,不会为setter方法加锁,适合内存小的移动设备;atomic:原子性,默认为setter方法加锁(默认就是atomic),线程安全。
PS: 在iOS开发过程中,一般都将属性声明为nonatomic,尽量避免多线程抢夺同一资源,尽量将加锁等资源抢夺业务交给服务器。
NSCondition常用于生产者-消费者模式,它继承了NSLocking协议,同样有lock和unlock方法。条件变量有点像信号量,提供了线程阻塞和信号机制,因此可以用来阻塞某个线程,并等待数据就绪再唤醒程序。
信号量主要有3个函数,分别是:
注意: 正常的使用顺序是先降低然后提高,这两个函数通常都是成对出现。
本文主要参考了这篇文章(
),并对其中所能理解的部分进行一一验证,以前没怎么写过类似的,如果有什么做的不好的地方还请大家多多见谅!
线程和进程在我们开发中,跟我们一直形影不离,那么什么是进程,什么是线程,它们又有什么关系,这篇文章将为您简单介绍。
线程概念
进程概念
地址空间:同⼀进程的线程共享本进程的地址空间( TLS是本地的线程栈存空间,线程的局部空间是某些操作系统为线程提供的私有空间,只具备有限的容量,并不属于线程,由操作系统单独安排的 ),⽽进程之间则是独⽴的地址空间。
资源拥有:同⼀进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独⽴的。
优点:
缺点:
时间⽚的概念:CPU在多个任务直接进⾏快速的切换,这个时间间隔就是时间⽚。
多线程同时执行
如果线程非常多
互斥锁⼩结
互斥锁参数
nonatomic⾮原⼦属性
atomic原⼦属性(线程安全),针对多线程设计的,默认值,保证同⼀时间只有⼀个线程能够写⼊(但是同⼀个时间多个线程都可以取值)
atomic本身就有⼀把锁(⾃旋锁)
单写多读:单个线程写⼊,多个线程可以读取
atomic:线程安全,需要消耗⼤量的资源
nonatomic:⾮线程安全,适合内存⼩的移动设备
iOS开发建议
所有属性都声明为nonatomic
尽量避免多线程抢夺同一块资源
尽量将加锁,资源抢夺的业务逻辑交给服务器处理,减少APP的压力
这篇文章简单介绍了线程与进程的概念,烦请大家不吝赐教。
在多线程开发中,我们常用到GCD,这里探讨一下GCD任务的取消:
1.在iOS 8以后,系统给我们提供了这样的取消函数 dispatch_block_cancel,不过这个也只能用于dispatch_block_create创建的dispatch_block_t,我们试验一下:
这时肯定是任务都会执行的
接下来,把注释的那一行 dispatch_block_cancel(block1);打开,看看效果:
我们发现block1确实被取消掉了。这是dispatch_block_cancel的用法。
2.很多时候,我们的场景不会去用dispatch_block_create创建dispatch_block_t,这个时候我们若想取消一个任务,可以考虑用一个条件来做,满足条件则执行此任务,不满足则不执行,举个例子:
效果如下:
写到这里,这儿其实还隐藏了一个知识点,就是block的变量捕获,有兴趣或是不理解的朋友可以研究一下。(如下,为何输出不是20而是10)
3.过渡到NSOperation
NSOperation是对GCD的封装,底层也是GCD。
NSOperation给我们封装了更多的api,这是我在Xcode中提出来的:
我们可以发现它有状态属性,有取消方法,也有添加依赖方法等...这里我们还是先说取消吧,下面来给大家写个demo:
这时输出是:
因为正在执行的任务,NSOperation也是不能取消的,所以也是需要将cancel在start前调用的(就如同满足一个条件是否需要cancel一样,也可以满足条件不调用start)
你知道吗?IOS软件工程师已经成为软件人才中的紧缺型人才!
国内外出现大量的“IOS人才荒”,未来几年IOS人才需求缺口将达百万!
招聘网站上,IOS软件工程师依然成为各大企业哄抢的对象,不少企业为招聘这类人才,不惜花重金招揽,腾讯、联想、新浪等国内企业也毫不例外地争夺IOS软件工程师,很多IOS开发岗位年薪已高达几十万!
课程内容
内容介绍
预备阶段
1、文件管理器Finder
2、iWork使用Numbers,Keynote,Pages
3、Safari浏览器
?
?
MacOs的使用,iWork的使用
iOS开发基础
1、iOS开发的系统环境介绍、Xcode集成开发环境详解、常用软件的介绍
2、数据类型、常量和变量、运算符、赋值语句和表达式;分支、循环
3、函数,数组(一维数组、二维数组、多维数组),结构体
4、指针数组、数组指针,结构体指针
5、指向指针的指针,宏定义、枚举,const,static
?
?
?
1、Xcode、SVN
2、C语言是iOS开发的入门基础语言,本部分主要介绍C语言的基本语法,程序结构,以及指针的各种操作。
为接下来Objective-C语言的学习打下基础。
?
1、面向对象(OOP)和面向过程、类(Class)和对象(Object)、类的定义
2、创建对象、self和super关键字、属性以及点语法(nonatomic,assign、retain、copy,readonly、readwrite)
3、便利构造器、单例(Singleton)
4、堆栈、内存管理(alloc、copy、retain,release、autorelease,strong、weak)
5、键值编码(KVC)、键值监听(KVO)、通知(NSNotification)
6、类目(Category)、延展(Extention)、协议(protocol)
?
?
?
?
?
?
?
Objective-C是iOS与MacOS开发的主要语言,它是对C语言的扩展,并融入了面向对象的特点。
包含封装、继承、多态三大特性,本部分主要介绍OC的基本语法,新的特性,内存管理等内容
?
1、字符串(NSStringNSMutableString)、数值对象(NSNumberNSValue)
2、数组(NSArray,NSMutableArray)、字典(NSDictionary,NSMutableDictionary)、集合(NSSet,NSMutableSet)、快速枚举(for?in)NSIndexPath
3、日期与时间(NSDate)、日期格式(NSDataFormatter)、日历(NSCalendar)、定时器(NSTimer)
4、文件管理(NSFileManager)、程序包(NSBundle)、缓冲区(NSData)
5、网络连接(NSURLConnection)、网络地址(NSURL)、网络请求(NSURLRequest)、请求回应(NSResponse)、错误信息处理(N0SError)
6、MVC编程,简单控件一:标签(UILabel)、文本输入(UITextField)、按钮(UIButton)、提示框(UIAlertView、UIActionSheet
7、使用面向对象OOP方法,实施计算机APP应用.要求学员应用前期学习中的大部分知识点
?
?
?
?
?
iOS的基础框架,包含了iOS开发的基本数据类型,在iOSSDK中几乎部NS开头的类都属于这个框架,我们将详细介绍开发中常用的类。
iOS开发
1、窗口(UIWindow)、视图(UIView)、应用程序(UIApplication)
2、绘图(drawRect)、QuartzCoreDemo、CGContextRef
3、触摸(UITouch)、事件(UIEvent)、手势(UIGestureRecognizer)、UIResponder、消息传递、响应者链
4、UIView以及CALayer动画(CAAnimation、CABasicAnimation、CAKeyFrameAnimation)
5、活动提示(UIActivityIndicatorView)、图像(UIImageView)
6、控件二:滚动视图(UIScrollView)、页控制器(UIPageControl)、开关(UISwitch)、单选(UISegmentControl)、滑块(UISlider)
7、控件三:多行文本(UITextView)、网页视图(UIWebView)、滚轮(UIPickerView)、日期滚轮(UIDatePickerView)、表格视图(UITableView)、表格项(UITableViewCell)
8、视图控制器(UIViewController)、导航控制器(UINavigationController)、标签控制器(UITabBarController)、表格控制器(UITableViewController)、相册控制器(UIImagePickerController)
?
?
?
?
?
?
?
?
?
?
?
?
?
?
UIKit处于Cocoa四层结构的上层CocoaTouch层,是iOS开发中的控件框架,定义了几乎部可视化控件,在iOS开发中占据地位,我们不会学习各个控件的用法,而且会讲述各个控件在不同版本系统里的样式,教大家如何自定义控件样式。
学完他们我们就可以做自己个性化的界面了。
结合前期所学知识,应用UIKit框架详解中所学的UI控件及知识点,模拟实现Safari浏览器
iPhoneSafari浏览器原型App。
1、音频播放(AVAudioPlayer)、视频播放(MPMoviePlayerViewController)以及播放ipod音乐
2、照相机(UIImagePickerController)以及相册的使用
3、短信(MFMessageComposeViewController)、邮件(MFMailComposeViewController)的使用
4、加速计(UIAccelerometer)的使用、帐号注册、真机调试、上传程序
5、地图(MKMapView)的使用以及定位(CoreLocation)
6、数据持久化(文件读写、sqlite数据库、归档、NSCoding协议)、云存储(iCloud)
7、多线程开发(NSThread、NSLock),操作队列(NSOperationQueue)
8、网络请求(GET、POST)、xml解析、json解析、Socket编程
?
iOS应用特性框架是对上述两个框架之外其他框架的统称。
主要课程内容为:音频、视频的播放、照相机的使用、加速计的应用,地图框架的使用、短信、邮件的应用等等,而且也会介绍当前应用开发中使用非常广泛的开源框架,同时还将讲解开发者帐号的注册、真机调试、以及程序上传。
iOS游戏开发
1、Cocos2DHelloWorld,CCDirector(导演类),CCScene(场景类),CCLayer
2、CCSprite(精灵类),CCAction(动作)
3、CCMemu(菜单),CCLabelTTF(标签)
4、CCPointParticleSystem(点粒子系统)
5、练习:植物大战僵尸游戏开发
?
2D游戏引擎的使用,部课程内容以"植物大战僵尸"为例,贯穿其中
1、在Xcode下编译C++程序,C++类Class,成员变量,成员函数,对象的创建
2、构造函数与析构函数,newdelete关键字,内存管理
3、继承,函数重载,操作符重载,拷贝构造
4、模版template与泛型
5、Objective-C与C++混合编程
?
C++是目前流行的开发语言之一,C++基本语法,C++面象对像的特性.在XCode下如何使用C++语言编程.
1、物理世界(b2World),刚体(b2Body),精灵与刚体连接
2、碰撞测试(b2ContactListener)
3、刚体的连接关节(b2Joint)
4、练习:愤怒的小鸟开发
5、OpenGLES开发基础
?
iOS游戏开发中使用多的物理引擎,以愤怒的小鸟为例学习Box2D开发.
项目实训
项目会用到网络、数据库、各种常用控件、以及各种Foundation类。
目前有很多项目可以选择使用,比如:互动百科(新闻类应用)、乐视(电影类应用)、创业邦(杂志类应用)、尚品网(购物类应用)、雅座空间(团购类应用)、找地(定位类应用)、我是数学家(教育类应用)、YY客户端(语音类应用)、麦咨达(条码扫描类应用)、中国建行(银行类应用)、CuteMath(游戏类应用)、车震摇摇乐(娱乐类应用)、新浪微博(微博类应用)等等
老师程带领学生做一个真实项目,从需求分析开始带起,然后技术调研,工期评估、编码、测试、优化代码、上传程序等项目内容会包括几点:网络数据解析、团队协调、版本管理、制作文档、复杂表布局、制作CELL类、动画应用、定位、方向地址解析、百度地图应用
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流