北京总部

0起点学Java,攀登编程语言常青树

0起点学Java,攀登编程语言常青树

2017-06-14

        Duang,duang,duang!让小伙伴们久等了!         自打上周五发布“0起点学IT”的专题预告后,各方同学都表示非常之期待,小卓今天如约而至,一起聊聊Java的学习心得。 0起点学JAVA, 攀登编程语言常青树! 小卓详解:        Java是一种编程语言,生活里处处可见他帅气的身影:10086电话查询系统、网上银行交易系统、淘宝京东等购物网站、手机游戏……        我国对Java人才的需求已达百万,并且每年都在以22%左右的速度增长!JAVA已经存在整整20年,但直到现在为止,JAVA依然是很多很多大型企业应用的技术。 小卓详解:        Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名。        Java语言中的许多库类名称,多与咖啡有关:如JavaBeans(咖啡豆)、NetBeans(网络豆)以及ObjectBeans(对象豆)等等。JAVA的标识也正是一杯正冒着热气的咖啡,被甲骨文收购后依旧沿用了咖啡的形象。 Wait,上面这段话的信息量有点大,小卓找到了Java语言编年史,供大家理解: 1995----SUN公司科学指导约翰·盖吉宣告Java技术。 1996----10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术。              9月,约8.3万个网页应用了JAVA技术来制作。 1997----JavaOne会议召开,参与者逾一万人,创当时全球同类会议规模之纪录。 1998----JDK1.1被下载超过2,000,000次。 2001----NOKIA宣布,到2003年将出售1亿部支持Java的手机 2005----JavaOne大会召开,SUN公司公开JavaSE6。 2009----Google App Engine开始支持Java。              甲骨文74亿美元收购Sun。取得java的版权。 2014-----甲骨文公司发布java8.0的正式版。 小卓详解:        学习JAVA入门是非常容易的,Java语言语法与C++语言很接近,但Java摒弃了C++中很少使用、很难理解、令人迷惑的特性,这使得Java语言更容易被IT新手所接纳。 小卓详解:        在中软卓越的教学体系中,0基础的同学会从Java编程语言的基础语法开始学起,老师将对语句进行逐条讲解,让同学们深入掌握“面向对象”的编程思想。 小卓详解:        中软卓越EGS教学体系注重实践,同学们从编写“Hello World”小程序开始,逐步提高,日常练、阶段练、冲刺练,最终能够实现企业级JavaEE项目,比如电子商务、社交网站、旅游网站、酒店管理系统等。        Java课程的精彩篇章刚刚拉开序幕,欲知详情,请速速点击:              从0开始学Java,攀登编程语言常青树!  下期IT课程预告: 0起点学Android,用实力拥抱移动互联!  12月17日中软卓越官方微信首发(ID:zrzyit2015)

更多>
0起点学IT,中软卓越十大IT课程全揭秘丨精彩即将来袭

0起点学IT,中软卓越十大IT课程全揭秘丨精彩即将来袭

2017-06-14

从0开始学IT,真的可以吗? 答案在这里!   备受小伙伴们期待和瞩目的 “0起点学IT,中软国际卓越培训中心十大IT课程全揭秘·官方首发” 精彩即将来袭!          没抢上沙发的同学,赶紧搬个小板凳!         看!第一波预热互动已经开始了:   小卓详解:        学习的时候最担心的是有问题找不着人问,中软卓越给你开小灶!我们的技术老师全天候一对一辅导,有问题可以随时问,能最快获得进步;还有大量的在线视频,课前可以提前预习,带着问题来听课,课后可以及时查缺补漏,扎实高效!   小卓详解:        在中软卓越,日常天天练,阶段集中练,结业冲刺练!   1、日常天天练:边讲边练,每个知识点都有实践练习。 2、阶段集中练:每个阶段结束后,都将有1-2周的项目实践。 3、结业冲刺练:结业前模拟实际项目,进行3-4周项目开发。     小卓详解:        经过在中软卓越4个月的学习,相当于积累了1年的工作经验,找工作的时候,你就不再是刚出校门的白纸一张了。同时,中软卓越有专业的就业服务团队,为你进行丰富的就业指导。然后,通过中软卓越举办的专场招聘会推荐给各大企业,还有什么好担心的?   首期IT课程预告: 0起点学Java,攀登编程语言常青树  12月15日中软卓越官方微信首发(ID:zrzyit2015) 敬 请 期 待 !

更多>
2017年潮流字体排版趋势,让你的作品更时尚!

2017年潮流字体排版趋势,让你的作品更时尚!

2017-06-12

技术和设计趋势一样,随着时间的推移总在不停地变化。对于网页设计师和前端而言,字体和排版所涉及到的技术和设计尤其是如此。不过纵观这几年,网页字体和排版在大方向上并没有明显变化,结合当前主流产品和设计,并不难确定2017年内,我们需要关注的这些字体和排版趋势。 定制:品牌化的字体 Bookerly, San Francisco, Product Sans 这些带着明显品牌烙印的英文字体,想必设计师们并不陌生,而新晋中文字体苹方,和最近火爆无比的思源系列新字体,思源宋体,无一例外,都在向我们传递一个明确的信息:品牌化字体的大时代来临了。 Bookerly 字体是亚马逊官方联合 Dalton Magg 为Kindle 系列产品所专门定制的字体。设计巨头苹果就更不必说,San Francisco 为苹果产品专用英文字体,覆盖了macOS、iOS、watchOS 和 tvOS 四个核心平台,官方还未中文用户专门定制了苹方字体,从文字层面上彻底完成了品牌化。当然,定制化的字体不仅仅是大企业的专利,在前不久美国总统竞选中落选的希拉里克林顿,还有专门的字体用来对抗大选期间流行的川普专用手写字体…… 通过 Prototypo 和 FontArk 这样的工具,自定义英文字体绝对是一件便捷又快速的事情。自定义字体和创意字体本质上是一致的:它们都旨在强化品牌的识别度。 响应:完美适配所有设备 如今每天都有新的产品,新的数字设备诞生,我们对于可以适应各种屏幕显示的字体,依然有着极大的需求。在桌面端上显示的超大字体能够带来视觉冲击力和戏剧性的效果,但是直接沿用到移动端,可能效果并不理想,会让信息的流动性变差,无法流畅地浏览。而这也是响应式设计所要解决的主要问题,字体应该能够根据各种不同的设备的使用场景进行适配。在响应式排版当中,字体尺寸、间距和整个布局都会遵循一整套排版规则,进行自适应。 虽然目前设计师们依然在不断遭遇新的问题,但是响应式排版的整体方案已经比较成熟。 对比:超大和超小尺寸的字体 正如同之前所说的,超大和超小的字体本身就能带来戏剧化的体验,通过尺寸上的对比,来营造独特的视觉奇观,影响访客的主观体验。超大字体毫无疑问是引人瞩目的,它能够将信息视觉化的呈现出来。 另一方面,超小的字体在多用在极简主义的网页上,它常常同首图搭配在一起,和超大字体不同的是,超小的文本内容常常是用来凸显图片内容的,它通过对比将视觉焦点转移到图片上,所发挥的作用和负空间有异曲同工之妙。 超大和超小的字体,本身能发挥作用主要是因为它们所带来的视觉落差,尺寸适中的文本相反没有这样的效果。当然,具体如何使用取决于你的品牌定位,以及你所要用的页面和场合。 性格:增加个性化的色彩 最深刻的艺术,要么是传达思想,要么发人深省。在字体和排版当中,最艺术化的,应该是使用独特而创新的字体来进行品牌设计与传达。实际上,今年我们已经看到越来越多的个性化字体设计用来强化品牌的设计案例了。而最值得关注也是最流行的,大概是水彩和渐变的色彩为字体注入性格的设计手法了。 手写字体也是一个明显的趋势,它们给品牌所赋予的个性更为明显和突出。不过,值得注意的是,有的字体确实是手写或者手绘的,而有的字体只是模拟这种笔触。 复古字体则是另外一个流行趋势,正如同我们常说的,复古一直在流行。复古的字体常常能够给人以精致和品质感。 可变:排版的未来 微软、谷歌、苹果和Adobe 在2016年9月联合发布了 OpenType 可变字体项目,这一项目让字体能够更好地适配响应式排版布局,让单个字体文件能够容纳更多不同样式的字体和布局,OpenType 字体文件规范让设计师能够将不同高度、不同字重、不同间距的不同类型的字体,有机的整合到一个字体文件中,并且灵活地运用到排版中去。 几何:令人着迷的图形 我们的生活中充满了各式各样的几何图形,几何图形本身也是字体设计的灵感来源之一。纤细的线条,棱角分明的形状,或者是圆润的边角,充满几何元素质感的设计让字体显得优雅而流畅,充满现代感。 在过去的一年当中,越来越多的字体设计中开始出现几何元素,不少企业和机构将几何字体和元素引入自家品牌,用以强化品牌所传达的信任感。 叠加:图片和文本的结合 图片和文本是网页设计中最常见的两个元素,两者常常相互配合,呈现信息。图文混排的设计由来已久,但是近几年来,设计师们尤其喜欢图片和文本相互叠加的设计,为了确保文本而和图片的呈现效果,两者要保持较好的对比度,文本不能影响图片的焦点,而图片也最好不要影响文本的识别。图片和文本两者的结合让内容拥有了层次,两者的结合应该是信息的强化,实际效果不应该混淆用户的视听。 混搭:不同字体的组合 一般而言,衬线体和衬线体的组合能够让排版看起来更加一致,但是衬线体、非衬线体甚至手写字体的有机组合,有的时候同样能创造一定的协调感。这种视觉设计的趋势非常的明显,字体的组合搭配结合具有现代风格的纹理/图案,常常能让整个设计更加摩登和丰满。 结语 网页设计中,图片的使用总是不可避免,但是字体和排版用好了常常能够化腐朽为神奇。这些设计趋势已经悄然出现在设计圈的各个角落,但是发觉和了解终究还是有差别的,了解它们,运用它们,才能让趋势掌握在自己手中。 来源:聊设计(ID:liaosheji2010);作者:liaosheji2010,小卓在此感谢原作者!

更多>
软件开发入门:如何在网页中解决设计师留给你的字体问题?

软件开发入门:如何在网页中解决设计师留给你的字体问题?

2017-03-28

       在一些推广活动项目的页面中,设计师可能会需要用到许多好看的字体,例如:方正综艺.ttf、方正兰亭、 方正喵呜.ttf等(此处省略N个字体)。        当设计师使用这些特殊字体的时候,前端攻城狮同学们往往因为这些字体“太有个性”而烦恼。今天小卓为大家分享一些经验,实用又经典,希望能对童鞋们的工作有所帮助! 方法一:切图法 方法二:Font-spider介绍及使用 Font-spider自动化构建工具gulp介绍及使用 步入正题: 应对设计师的"字体”难题,有两种解决方式可供同学们挑选,方式一是我们熟知常用的切图法,方法二是今日文章重点介绍的Font-spider。 方法一:切图法 大多数的活动页面采用的方式是将字体储存为单个的小图片,这种方式简单粗暴。 有关切图方式的优缺点,想必大家都与小卓有相同的感受。切图方式简单易用,效果与设计图完全一致。然而,它也有很多缺点,例如:如果只有几张图片的话,切图方式简单而且效率较高,但如果有几十张几百张的图片拿来运用的话...不论是切图或者后期的修改都是噩梦。 方法二:Font-spider 什么是Font-spider: 字蛛通过分析本地 CSS 与 HTML 文件获取 WebFont 中没有使用的字符,并将这些字符数据从字体中删除以实现压缩,同时生成跨浏览器使用的格式。 中文字体动辄10M+的大小,使我们无法直接引用字体文件。通俗地讲,font-spider,就是将HTML里使用到的文字,单独打包成一个新的字体文件。那么,究竟该如何具体操作呢?且看以下讲解。 如何使用Font-spider 第一步:安装font-spider 使用Node.js安装font-spider: npm install font-spider -g (注:Node.js下载地址:https://nodejs.org/en/) 第二步:在项目中使用webfond 项目目录: 在HTML里引入font.css 声明一个新的字体,我们把它命名为”FZ”。 第三部:运行运行 font-spider 命令: font-spider demo.html 我们可以发现页面依赖的字体将会自动压缩好,将1986KB的字体文件压缩成几KB的新字体,而且会根据不同浏览器的兼容性打包成不同类型的文件。 原字体会也会备份,我们看一下生成后的目录结构: 压缩后出现4个字体文件,我们在CSS中已经引入。而我们的原文件会备份到.font-spider这个目录下。 执行后的效果: 如何使用自动化构建工具gulp实时自动编译? 在真实的开发中,我们肯定不想每次保存代码后都去命令行输入font-spider命令去编译,这个时候就需要依靠自动化构建工具去做实时编译。 这里我们推荐使用gulp(因为上手很简单)。   第一步:安装gulp 没有安装过gulp的同学,使用NPM在全局下安装Gulp。 npm install --global gulp   在项目根目录下,将gulp、gulp-font-spider、gulp-watch作为项目开发依赖(devDependencies)安装: npm install gulp gulp-font-spider --save-dev (注①:gulp-font-spider是font-spider基于gulp的插件) (注②:gulp-watch可以监听文件的保存)   第二步:配置gulp 在项目根目录下创建gulpfile.js文件。 1.引入gulp、gulp-font-spider、gulp-watch这三个项目开发依赖。 2.配置gulp-font-spider、和gulp-watch监听demo.html从而自动执行font-spider。 此时的项目目录结构: 第三步:执行gulp命令 此时我们将H1标签的内容改为“我在正在使用Gulp!”并保存。 返回命令行工具,我们会发现gulp已经帮我们自动执行了font-spider。 看一下效果: 更多精彩内容请进入技术知识库!

更多>
CSS开发:5分钟快速上手Compass

CSS开发:5分钟快速上手Compass

2017-03-14

 Sass是一种"CSS预处理器",可以让CSS的开发变得简单和可维护。但是,只有搭配Compass,它才能显出真正的威力,学会了Compass,你的CSS开发效率会上一个台阶。 Compass与CSS的关系类似于JQuery与Java,封装了一系列有用的模块和模板,补充Sass的功能。 01 安装 Compass是用Ruby语言开发的,所以安装它之前,必须安装Ruby。  Ruby安装地址:http://www.ruby-lang.org/en/downloads/ 命令行模式(windows去掉sodu)  sudo gem install compass  Compass是基于Sass的,所以Ruby会自动帮我们安装好Sass。 如果gem安装失败,可以手动下载。  下载地址:https://rubygems.org/gems/compass 命令行模式(windows去掉sodu)  Sudo gem install --local compass.gem 02 项目初始化&编译 创建compass项目(命令行模式)  compass create myproject  cd myproject Compass编译命令  compass compile Compass自动编译命令  compass watch 03 Compass模块 Compass内置五个模块,分别为reset、 css3、 layout、 typography、 utilities。 reset模块 重置浏览器默认样式  @import "compass/reset"; css3模块 提供19种CSS3命令,为css3属性添加不同浏览器兼容性前缀  以transition属性为例transition: all .5s; @import "compass/css3"; @include transition(all,.5s); 编译结果为: -moz-transition: all, 0.5s; -o-transition: all, 0.5s; -webkit-transition: all, 0.5s; transition: all, 0.5s; layout模块 提供布局功能  以sticky-footer()为例,指定的元素始终会出现在浏览器最低端 @import "compass/layout"; @include sticky-footer(54px); Typography 模块 提供版式功能 以链接为例,使用link-colors()为不同状态下设置不同的color @import "compass/typography"; @include link-colors(#00c, #0cc, #c0c, #ccc, #cc0); utilities模块 该模块提供某些不属于其他模块的功能。 例如做一个清除浮动的class  import "compass/utilities/"; .clearfix { @include clearfix; } 除了这5个模块,Compass还提供了一系列好用的函数。 例如如image-width()和image-height()返回图片的宽和高。 $pic_path: "../images/pic.jpg"; #pic{ background: url($pic_path); width: image-width($pic_path); height: image-height($pic_path); } 返回结果如下: #pic { background: url("../images/pic.jpg"); width: 590px; height: 100px; } 这么做,以后就省去引入图片时,还要查看图片大小的问题了。 赶快试试Compass,去感受它真正的威力吧! 这是最好的时代,这是最坏的时代 It was the best of times, it was the worst of times 每一个时代,都会成全一部分人 你的选择决定你的时代 抓住互联网的巨大机遇,成就自我别再犹豫! 中软卓越以人才供应链为导向,提供基于岗位的项目实战训练,投重金研发了专门针对大学生的准员工“5R(5Real)”实训课程体系(5R即:真实的工作环境、真实的项目经理、真实的项目案例、真实的工作压力、真实的工作机会),致力于培养符合社会实际需求的软件人才,多年来已累计为自身及全行业培养合格准员工超过10万人。  想学IT找小卓 留言微信:您的姓名、联系方式、所在地区、想了解的课程 登录中软卓越官方网站客服咨询:http://etc.chinasofti.com 或 http://www.zretc.com 拨打电话:400-666-3775 与小卓成为QQ好友:3177669389

更多>
Objective-C知识点——property属性

Objective-C知识点——property属性

2017-03-08

Objective-C中的@property关键字及其用法 1)        定义: property是用来捕获对象的状态。它们反射出对象的内在属性以及和其他对象的关系。它提供了一个安全的、便捷的方法,以便我们访问对象的属性,而不需要写出各种访问方法(getter、setter)。 使用@property关键字有以下几点好处: 自动的实现getter和seeter方法:当你声明了property时,会自动的实现getter和setter方法而不用自己写出来。 使用该关键字使得目的非常明确,就是用来进行数据封装并提供访问接口的。 property关键字可以通过一系列附加信息,来方便的约束属性的行为。比如提供了各种附加声明如assign、copy、weak、strong、atomic、nonatomic等。 2)        @property附加声明的作用,见下述说明: @property与@synthesize是成对出现的,可以自动生成某个类成员变量的存取方法。在Xcode4.5以及以后的版本,@synthesize可以省略。 附加属性的约束: ①atomic与nonatomic atomic:默认是有该属性的,这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。 nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率。 ②readwrite与readonly readwrite:这个属性是默认的情况,会自动为你生成存取器。 readonly:只生成getter不会有setter方法。 readwrite、readonly这两个属性的真正价值,不是提供成员变量访问接口,而是控制成员变量的访问权限。 ③strong与weak strong:强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放。 weak:弱引用,不决定对象的存亡。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。 strong与retain功能相似;weak与assign相似,只是当对象消失后weak会自动把指针变为nil; ④assign、copy、retain assign:默认类型,setter方法直接赋值,不进行任何retain操作,不改变引用计数。一般用来处理基本数据类型。 retain:释放旧的对象(release),将旧对象的值赋给新对象,再令新对象引用计数为1。我理解为指针的拷贝,拷贝一份原来的指针,释放原来指针指向的对象的内容,再令指针指向新的对象内容。 copy:与retain处理流程一样,先对旧值release,再copy出新的对象,retainCount为1.为了减少对上下文的依赖而引入的机 制。我理解为内容的拷贝,向内存申请一块空间,把原来的对象内容赋给它,令其引用计数为1。对copy属性要特别注意:被定义有copy属性的对象必须要 符合NSCopying协议,必须实现-(id)copyWithZone:(NSZone *)zone方法。 也可以直接使用: 使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double,char, 等等) 使用copy: 对NSString 使用retain: 对其他NSObject和其子类 成就年薪百万程序员就到中软国际教育!

更多>
IOS开发系列--Objective-C之协议、代码块、分类

IOS开发系列--Objective-C之协议、代码块、分类

2017-03-07

概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,这一节将重点介绍ObjC中一些常用的语法特性。当然这些内容虽然和其他高级语言命名不一样,但是我们都可以在其中找到他们的影子,在文章中我也会对比其他语言进行介绍,这一节的重点内容如下: 协议protocol 代码块block 分类category 协议protocol 在ObjC中使用@protocol定义一组方法规范,实现此协议的类必须实现对应的方法。熟悉面向对象的童鞋都知道接口本身是对象行为描述的协议规范。也就是说在ObjC中@protocol和其他语言的接口定义是类似的,只是在ObjC中interface关键字已经用于定义类了,因此它不会再像C#、Java中使用interface定义接口了。 假设我们定义了一个动物的协议AnimalDelegate,人员Person这个类需要实现这个协议,请看下面的代码: AnimalDelegate.h // //  AnimalDelegate.h //  Protocol&Block&Category // //  Created by Kenshin Cui on 14-2-2. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //     //定义一个协议 @protocol AnimalDelegate   @required //必须实现的方法 -(void)eat;   @optional //可选实现的方法 -(void)run; -(void)say; -(void)sleep;   @end   Person.h // //  Person.h //  Protocol&Block&Category // //  Created by Kenshin Cui on 14-2-2. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import #import "AnimalDelegate.h"   @interface Person : NSObject   -(void)eat;   @end Person.m // //  Person.m //  Protocol&Block&Category // //  Created by Kenshin Cui on 14-2-2. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import "Person.h"   @implementation Person   -(void)eat{     NSLog(@"eating..."); }   @end 这里需要说明几点: 一个协议可以扩展自另一个协议,例如上面AnimalDelegate就扩展自NSObject,如果需要扩展多个协议中间使用逗号分隔; 和其他高级语言中接口不同的是协议中定义的方法不一定是必须实现的,我们可以通过关键字进行@required和@optional进行设置,如果不设置则默认是@required(注意ObjC是弱语法,即使不实现必选方法编译运行也不会报错); 协议通过<>进行实现,一个类可以同时实现多个协议,中间通过逗号分隔; 协议的实现只能在类的声明上,不能放到类的实现上(也就是说必须写成@interface Person:NSObject而不能写成@implementation Person); 协议中不能定义属性、成员变量等,只能定义方法; 事实上在ObjC中协议的更多作用是用于约束一个类必须实现某些方法,而从面向对象的角度而言这个类跟接口并不一定存在某种自然关系,可能是两个完全不同意义上的事物,这种模式我们称之为代理模式(Delegation)。在Cocoa框架中大量采用这种模式实现数据和UI的分离,而且基本上所有的协议都是以Delegate结尾。 现在假设需要设计一个按钮,我们知道按钮都是需要点击的,在其他语言中通常会引入事件机制,只要使用者订阅了点击事件,那么点击的时候就会触发执行这个事件(这是对象之间解耦的一种方式:代码注入)。但是在ObjC中没有事件的定义,而是使用代理来处理这个问题。首先在按钮中定义按钮的代理,同时使用协议约束这个代理(事件的触发者)必须实现协议中的某些方法,当按钮处理过程中查看代理是否实现了这个方法,如果实现了则调用这个方法。 KCButton.h // //  KCButton.h //  Protocol&Block&Category // //  Created by Kenshin Cui on 14-2-2. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import @class KCButton;   //一个协议可以扩展另一个协议,例如KCButtonDelegate扩展了NSObject协议 @protocol KCButtonDelegate   @required //@required修饰的方法必须实现 -(void)onClick:(KCButton *)button;   @optional //@optional修饰的方法是可选实现的 -(void)onMouseover:(KCButton *)button; -(void)onMouseout:(KCButton *)button;   @end   @interface KCButton : NSObject   #pragma mark - 属性 #pragma mark 代理属性,同时约定作为代理的对象必须实现KCButtonDelegate协议 @property (nonatomic,retain) iddelegate;   #pragma mark - 公共方法 #pragma mark 点击方法 -(void)click;   @end KCButton.m // //  KCButton.m //  Protocol&Block&Category // //  Created by Kenshin Cui on 14-2-2. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import "KCButton.h"   @implementation KCButton   -(void)click{     NSLog(@"Invoke KCButton's click method.");     //判断_delegate实例是否实现了onClick:方法(注意方法名是"onClick:",后面有个:)     //避免未实现ButtonDelegate的类也作为KCButton的监听     if([_delegate respondsToSelector:@selector(onClick:)]){         [_delegate onClick:self];     } }   @end MyListener.h // //  MyListener.h //  Protocol&Block&Category // //  Created by Kenshin Cui on 14-2-2. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import @class KCButton; @protocol KCButtonDelegate;   @interface MyListener : NSObject -(void)onClick:(KCButton *)button; @end MyListener.m // //  MyListener.m //  Protocol&Block&Category // //  Created by Kenshin Cui on 14-2-2. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import "MyListener.h" #import "KCButton.h"   @implementation MyListener -(void)onClick:(KCButton *)button{     NSLog(@"Invoke MyListener's onClick method.The button is:%@.",button); } @end main.m // //  main.m //  Protocol&Block&Category // //  Created by Kenshin Cui on 14-2-2. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import #import "KCButton.h" #import "MyListener.h"   int main(int argc, const char * argv[]) {     @autoreleasepool {                 KCButton *button=[[KCButton alloc]init];         MyListener *listener=[[MyListener alloc]init];         button.delegate=listener;         [button click];         /* 结果:          Invoke KCButton's click method.          Invoke MyListener's onClick method.The button is:.          */     }     return 0; } 我们通过例子模拟了一个按钮的点击过程,有点类似于Java中事件的实现机制。通过这个例子我们需要注意以下几点内容: id可以表示任何一个ObjC对象类型,类型后面的”<协议名>“用于约束作为这个属性的对象必须实现该协议(注意:使用id定义的对象类型不需要加“*”); MyListener作为事件触发者,它实现了KCButtonDelegate代理(在ObjC中没有命名空间和包的概念,通常通过前缀进行类的划分,“KC”是我们自定义的前缀) 在.h文件中如果使用了另一个文件的类或协议我们可以通过@class或者@protocol进行声明,而不必导入这个文件,这样可以提高编译效率(注意有些情况必须使用@class或@protocol,例如上面KCButton.h中上面声明的KCButtonDelegate协议中用到了KCButton类,而此文件下方的KCButton类声明中又使用了KCButtonDelegate,从而形成在一个文件中互相引用关系,此时必须使用@class或者@protocol声明,否则编译阶段会报错),但是在.m文件中则必须导入对应的类声明文件或协议文件(如果不导入虽然语法检查可以通过但是编译链接会报错); 使用respondsToSelector方法可以判断一个对象是否实现了某个方法(需要注意方法名不是”onClick”而是“onClick:”,冒号也是方法名的一部分);    学习更多IOS开发知识就到中软国际!

更多>
数据结构中二叉树的基本操作

数据结构中二叉树的基本操作

2017-03-06

二叉树的基本操作,可能包括: 创建,遍历,转化,复制,删除等。 遍历:前中后三种顺序的遍历,已经是各数据结构与算法教程的最基础内容,在此不重复。 创建:大多数据结构教程当中的二叉树创建程序,都是采用的递归方式,递归方式创建的二叉树与遍历的过程相似,所创建的二叉树,也是采用左右子节点方式,后续进行遍历操作十分方便。 转化:直觉上,最简单的二叉树存储方式其实是如下图的数组: *此图出自某高校数据结构ppt,但实在难以查证是哪个学校,无法直接感谢,请谅解。 首先,提供个满二叉树大小的数组,然后其中数值按完全二叉树存储。 显然,此种顺序存储方法:第i号(这里编号指对应的完全二叉树的位序)结点的左右孩子一定保存在第2i及2i+1号单元中。 故此,为兼顾存储的直观与遍历等操作的方便,从顺序数组向左右子节点存储方式的转化也就十分重要。 1-转化方法 分为几个步骤: (1)准备原始数组 (2)分析数组中的有效值,对应二叉树节点非空; (3)创建二叉树节点; (4)计算除最后一层子节点外,构造节点间父子关系时的循环次数; (5)构造二叉树节点间的父子关系; (6)确实二叉树根节点; 主要代码: (1)准备原始数组 1. //原始数组  2.     int intBiTreeInit[ARR_COUNT];  3.   4.      5.     //初始化原始数组至无效值  6.     for(int i=0;i<=ARR_COUNT-1;i++)  7.         intBiTreeInit[i]=NVALUE;  8.   9.     //本if条件确保ARR_COUNT是否是的乘方-1  10.     if(0==(ARR_COUNT & (ARR_COUNT+1)))  11.     {  12.         for(int i=0;i<=ARR_COUNT-1;i++)  13.             intBiTreeInit[i]=2*(i+1);  14.     }  15.     else  16.         return RET_ERR;  17.   18.     //使最后两数为无效值  19.     intBiTreeInit[ARR_COUNT-1]=NVALUE;  20.     intBiTreeInit[ARR_COUNT-2]=NVALUE;  (2)分析数组中的有效值 1. //开始获得数组中有效值位置  2.    int intRel=0;  3.    int intArr=0;  4.    for(intArr=0;intArr<=intCount-1;intArr++)  5.    {  6.        if(elemArr[intArr]!=elemNValue)  7.        {  8.            intRel++;  9.            vecIntEffPos.push_back(intArr);  10.        }  11.        }  (3)创建二叉树节点  1. //数组中有效值对应创建节点  2. //同时初始化父子节点为NULL  3. for(intArr=0;intArr<=intRel-1;intArr++)  4. {  5.     pBiTreeTemp=(PBiTreeNode)malloc(sizeof(BiTreeNode));;  6.       7.     if(NULL==pBiTreeTemp)                                //判断是否有足够的内存空间  8.     {  9.         cout<<"Memory alloc failure"<

更多>

推荐阅读

更多

友情链接:

中软卓越java培训地址:北京市海淀区科学院南路2号融科资讯中心C座北楼12层 联系电话:400-666-3775 邮箱账号:etc-marketing@chinasofti.com

©2008-2016 北京中软国际教育科技股份有限公司 京ICP备14058756号-2