人人范文网 员工个人工作总结

ios程序员工作总结(精选多篇)

发布时间:2020-07-20 08:33:14 来源:员工个人工作总结 收藏本文 下载本文 手机版

推荐第1篇:iOS开发高级程序员面试题答案

一、判断题(每题2分,共20分)

1、UITableView能够绑定多个数据源。(错)

2、一个UIViewController可以管理多个UITableView。(对)

3、Object-c的类可以多重继承。(错)

4、objective-c类里面的方法只有两种, 静态方法和实例方法。(对)

5、NSFileManager和NSWorkspace在使用时都是基于进程进行单件对象的实例化。(对)

6、用类别增加方法时,不能与原来类中的方法产生名称冲突。(错)

7、frame指的是该view在本身坐标系统中 的位置和大小。(错)

8、method是一个方法的名字,selector是一个组合体。(错)

9、ARC是编译特性,不是运行时特性,在编译时,编译器会自动加上释放代码。(对)

10、从iOS4之后,Safari支持全屏浏览,Siri支持普通话。(对)

二、填空题(每空2分,共20分)

1、iOS是使用Objective-C语言编写的,使用该语言开发的Cocoa是一款功能强大的用户界面工具包,也是iOS的核心。

2、数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。链表恰好相反,其中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。

3、发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作。而发送异步请求不会阻塞主线程,会建立一个新的线程来操作,之后程序可以继续运行。

4、autorelease只是把Object放入了当前的autorelease pool中,当它被释放时,其中的所有Object都会被调用Release。

5、作为Objective-C导入头文件的关键字,#import用来包含系统的头文件,#import””用来包含用户头文件。

三、简述题(每题4分,共20分)

1、delegate和notification有什么区别,什么情况下使用?

答:delegate:消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate同意然后发送者响应事件,delegate机制使得接收者可以改变发送者的行为。 通常发送者和接收者的关系是直接的一对多的关系。

notification:消息的发送者告知接收者事件已经发生或者将要发生,仅此而已,接收者并不能反过来影响发送者的行为。通常发送者和接收者的关系是间接的多对多关系。

2、Object-C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?

答:线程创建有三种方法:使用NSThread创建、使用 GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue。

在主线程执行代码,方法是 performSelectorOnMainThread。

如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone。

3、iOS有哪些数据持久化方式?

答:四种:属性列表、对象归档、SQLite3和Core Data。

4、Objective-C如何对内存管理的,说说你的看法和解决方法?

答:Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。解决方法的话:谁持有,谁释放。

5、如何对iOS设备进行性能测试?

答:Profile->Instruments ->Time Profiler。

四、问答题(每题10分,共20分)

1、什么是MVC,为什么使用MVC,有什么好处?描述一下iOS SDK中如何实现MVC的开发模式。

答:MVC分别为:模型(Model),视图(View)和控制Controller)。

模型(Model):即“数据模型”,用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“模型”有对数据直接访问的权力,例如对数据库的访问。 视图(View):视图层能够实现数据有目的显示。

控制器(Controller):控制器起到不同层面间的组织作用,用于控制应用程序的流程。 对于iOS SDK,所有的View都是视图层的,它应该独立于模型层,由视图控制层来控制。所有的用户数据都是模型层,它应该独立于视图。所有的ViewController都是控制层,由它负责控制视图,访问模型数据。

2、请阐述UIViewController的生命周期,包括代码的执行顺序。答:当一个视图控制器被创建,并在屏幕上显示的时候。代码的执行顺序

// 视图显示在屏幕上的顺序

1、alloc 创建对象,分配空间。

2、init (initWithNibName) 初始化对象,初始化数据。

3、viewload 从nib载入视图, 这一步不需要去干涉。除非没有使用xib文件创建视图。

4、viewDidLoad 加载完毕,可以进行自定义数据以及动态创建其他控件。

5、viewWillAppear 视图将出现在屏幕之前,马上这个视图即将显示在屏幕上。

6、viewDidAppear 视图已在屏幕上渲染完成。

// 视图将被从屏幕上移除的顺序

1、viewWillDisappear 视图将被从屏幕上移除之前执行。

2、viewDidDisappear 视图已经被从屏幕上移除。

3、dealloc 视图被销毁,此时需要在init和viewDidLoad中创建的对象进行释放。

4、viewDidUnload 出现内存警告在内存不足时执行,并对所有非当前显示的controller执行。 本视图的所有子视图将被销毁,以释放内存,此时开发者需要手动对viewLoad、viewDidLoad中创建的对象释放内存。 因为当这个视图再次显示在屏幕上的时候,viewLoad、viewDidLoad 再次被调用,以便再次构造视图。

五、论述题(20分)

请针对正泰中自智慧水务APP的需求(见现场展示的原型),论述您的开发思路和使用的开发技术。

推荐第2篇:黑马程序员:IOS面试宝典数据存储

数据存储(★★)

1、IOS中常用的数据存储方式有哪些?

答:1.数据存储有四种方案,NSUserDefault,KeyChain,File,DB.2.其中File有三种方式:plist,Archiver,Stream 3.DB包括core Data和FMDB

2、说一说你对sqlite的认识

SQLite是目前主流的嵌入式关系型数据库,其最主要的特点就是轻量级、跨平台,当前很多嵌入式操作系统都将其作为数据库首选。虽然SQLite是一款轻型数据库,但是其功能也绝不亚于很多大型关系数据库。学习数据库就要学习其相关的定义、操作、查询语言,也就是大家日常说得SQL语句。和其他数据库相比,SQLite中的SQL语法并没有太大的差别,因此这里对于SQL语句的内容不会过多赘述,大家可以参考SQLite中其他SQL相关的内容,这里还是重点讲解iOS中如何使用SQLite构建应用程序。先看一下SQLite数据库的几个特点:

1.基于C语言开发的轻型数据库

2.在iOS中需要使用C语言语法进行数据库操作、访问(无法使用ObjC直接访问,因为libqlite3框架基于C语言编写)

3.SQLite中采用的是动态数据类型,即使创建时定义了一种类型,在实际操作时也可以存储其他类型,但是推荐建库时使用合适的类型(特别是应用需要考虑跨平台的

情况时)

4.建立连接后通常不需要关闭连接(尽管可以手动关闭)

在iOS中操作SQLite数据库可以分为以下几步(注意先在项目中导入libsqlite3框架):

1.打开数据库,利用sqlite3_open()打开数据库会指定一个数据库文件保存路径,如果文件存在则直接打开,否则创建并打开。打开数据库会得到一个sqlite3类型的对象,后面需要借助这个对象进行其他操作。

2.执行SQL语句,执行SQL语句又包括有返回值的语句和无返回值语句。3.对于无返回值的语句(如增加、删除、修改等)直接通过sqlite3_exec()函数执行;

4.对于有返回值的语句则首先通过sqlite3_prepare_v2()进行sql语句评估(语法检测),然后通过sqlite3_step()依次取出查询结果的每一行数据,对于每行数据都可以通过对应的sqlite3_column_类型()方法获得对应列的数据,如此反复循环直到遍历完成。当然,最后需要释放句柄。

3、说一说你对FMDB的认识

FMDB是一个处理数据存储的第三方框架,框架是对sqlite的封装,整个框架非常轻量级但又不失灵活性,而且更加面向对象。FMDB有如下几个特性:

1.FMDB既然是对于libsqlite3框架的封装,自然使用起来也是类似的,使用前也要打开一个数据库,这个数据库文件存在则直接打开否则会创建并打开。这里FMDB引入了一个MFDatabase对象来表示数据库,打开数据库和后面的数据库操作全部依

赖此对象。

2.对于数据库的操作跟前面KCDbManager的封装是类似的,在FMDB中FMDatabase类提供了两个方法executeUpdate:和executeQuery:分别用于执行无返回结果的查询和有返回结果的查询。当然这两个方法有很多的重载这里就不详细解释了。唯一需要指出的是,如果调用有格式化参数的sql语句时,格式化符号使用“?”而不是“%@”、等。

3.我们知道直接使用libsqlite3进行数据库操作其实是线程不安全的,如果遇到多个线程同时操作一个表的时候可能会发生意想不到的结果。为了解决这个问题建议在多线程中使用FMDatabaseQueue对象,相比FMDatabase而言,它是线程安全的。

4.将事务放到FMDB中去说并不是因为只有FMDB才支持事务,而是因为FMDB将其封装成了几个方法来调用,不用自己写对应的sql而已。其实在在使用libsqlite3操作数据库时也是原生支持事务的(因为这里的事务是基于数据库的,FMDB还是使用的SQLite数据库),只要在执行sql语句前加上“begin transaction;”执行完之后执行“commit transaction;”或者“rollback transaction;”进行提交或回滚即可。另外在Core Data中大家也可以发现,所有的增、删、改操作之后必须调用上下文的保存方法,其实本身就提供了事务的支持,只要不调用保存方法,之前所有的操作是不会提交的。在FMDB中FMDatabase有beginTransaction、commit、rollback三个方法进行开启事务、提交事务和回滚事务。

4、说一说你对Core Data的认识

Core Data使用起来相对直接使用SQLite3的API而言更加的面向对象,操作过

程通常分为以下几个步骤:

1.创建管理上下文

创建管理上下可以细分为:加载模型文件->指定数据存储路径->创建对应数据类型的存储->创建管理对象上下方并指定存储。

经过这几个步骤之后可以得到管理对象上下文NSManagedObjectContext,以后所有的数据操作都由此对象负责。同时如果是第一次创建上下文,Core Data会自动创建存储文件(例如这里使用SQLite3存储),并且根据模型对象创建对应的表结构。

2.查询数据

对于有条件的查询,在Core Data中是通过谓词来实现的。首先创建一个请求,然后设置请求条件,最后调用上下文执行请求的方法。

3.插入数据

插入数据需要调用实体描述对象NSEntityDescription返回一个实体对象,然后设置对象属性,最后保存当前上下文即可。这里需要注意,增、删、改操作完最后必须调用管理对象上下文的保存方法,否则操作不会执行。

4.删除数据

删除数据可以直接调用管理对象上下文的deleteObject方法,删除完保存上下文即可。注意,删除数据前必须先查询到对应对象。

5.修改数据

修改数据首先也是取出对应的实体对象,然后通过修改对象的属性,最后保存上下文。

5、OC中有哪些数据存储方式,各有什么区别? OC中有四种数据存储方式: 1).NSUserDefaults,用于存储配置信息 2).SQLite,用于存储查询需求较多的数据 3).CoreData,用于规划应用中的对象

4).使用基本对象类型定制的个性化缓存方案.NSUserDefaults:对象中储存了系统中用户的配置信息,开发者可以通过这个实例对象对这些已有的信息进行修改,也可以按照自己的需求创建新的配置项。SQLite擅长处理的数据类型其实与NSUserDefaults差不多,也是基础类型的小数据,只是从组织形式上不同。开发者可以以关系型数据库的方式组织数据,使用SQL DML来管理数据。一般来说应用中的格式化的文本类数据可以存放在数据库中,尤其是类似聊天记录、Timeline等这些具有条件查询和排序需求的数据。 CoreData是一个管理方案,它的持久化可以通过SQLite、XML或二进制文件储存。它可以把整个应用中的对象建模并进行自动化的管理。从归档文件还原模型时CoreData并不是一次性把整个模型中的所有数据都载入内存,而是根据运行时状态,把被调用到的对象实例载入内存。框架会自动控制这个过程,从而达到控制内存消耗,避免浪费。无论从设计原理还是使用方法上看,CoreData都比较复杂。因此,如果仅仅是考虑缓存数据这个需求,CoreData绝对不是一个优选方案。CoreData的使用场景在于:整个应用使用CoreData规划,把应用内的数据通过CoreData建模,完全基于CoreData架构应用。使用基本对象类型定制的个性化缓存方案:从需求出发分析缓存数据有哪些要求:按Key查找,快速读取,写入不影响正常操作,不浪费内存,支持归档。这些都是基本需求,那么再进一步或许还需要固定缓存项数量,支持队列缓存,缓存过期等。

数据存储这一块,面试常问, 你常用哪一种数据存储?什么是序列化?sqlite是直接用它还是用封装了它的第三方库?尤其是会问sqlite和core data的区别?

5、IOS平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗?

iOS中可以有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data coredata可以使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它。coredata提供了基础结构去处理常用的功能,例如保存,恢复,撤销和重做,允许你在app中继续创建新的任务。在使用coredata的时候,你不用安装额外的数据库系统,因为coredata使用内置的sqlite数据库。coredata将你app的模型层放入到一组定义在内存中的数据对象。coredata会追踪这些对象的改变,同时可以根据需要做相应的改变,例如用户执行撤销命令。当coredata在对你app数据的改变进行保存的时候,core data会把这些数据归档,并永久性保存。mac os x中sqlite库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。可以在多个平台使用,sqlite是一个轻量级的嵌入式sql数据库编程。与coredata框架不同的是,sqlite是使用程序式的,sql的主要的API来直接操作数据表。Core Data不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS)。虽然Core Dta支持SQLite作为一种存储类型, 但它不能使用任意的SQLite数据库。Core Data在使用的过程种自己创建这个数据库。Core Data支持对

一、对多的关系。

6、如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢?

编写SQL语句来操作原来表中的字段 增加表字段

ALTER TABLE 表名 ADD COLUMN 字段名字段类型; • 删除表字段

ALTER TABLE 表名 DROP COLUMN 字段名;

.

修改表字段

ALTER TABLE 表名 RENAME COLUMN 旧字段名 TO 新字段名;

7、SQLite数据存储是怎么用?

添加SQLite动态库:

导入主头文件:#import 利用C语言函数创建\\打开数据库,编写SQL语句

8、简单描述下客户端的缓存机制?

1>缓存可以分为:内存数据缓存、数据库缓存、文件缓存 2>每次想获取数据的时候 3>先检测内存中有无缓存

4>再检测本地有无缓存(数据库\\文件) 5>最终发送网络请求

6>将服务器返回的网络数据进行缓存(内存、数据库、文件), 以便下次读取

9、你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些需要在线程中创建或者传递?你是用什么样的策略来实现的?

1>CoreData是对SQLite数据库的封装

2>CoreData中的NSManagedObjectContext在多线程中不安全

3>如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext 4>每个NSManagedObjectContext对象实例都可以使用同一个NSPersistentStoreCoordinator实例,这是因为NSManagedObjectContext会在便用NSPersistentStoreCoordinator前上锁

10、core data数据迁移

博客地址: http://blog.csdn.net/jasonblog/article/details/17842535

11、FMDB的使用和对多张表的处理

博客地址: http://blog.csdn.net/wscqqlucy/article/details/8464398

12、说说数据库的左连接和右连接的区别

数据库左连接和右连接的区别:主表不一样通过左连接和右连接,最小条数为3(记录条数较小的记录数),最大条数为12(3×4)技术博客的地址 : http://www.daodoc.com/

推荐第3篇:100个iOS开发设计程序员面试题汇总

www.daodoc.com

美国上市公司

亿元级外企IT培训企业

100个iOS开发/设计程序员面试题汇总

无论是对于公司还是开发者或设计师个人而言,面试都是一项耗时耗钱的项目,本文作者Cameron Banga从编程、设计、App Store等各个方面对iOS开发者及设计师在面试时可能会遇到的问题进行了筛选与汇总。一方面,能够帮助HR在短时间内获取更多反馈信息,更好地甄选合适人选,而iOS开发者及设计师在寻找相关工作时,也可作为参考,为面试做好万全准备。

一、常见问题

你昨天/这周学习了什么?

你为什么热衷于软件开发?

你对哪一种控制系统比较熟悉?

是否参与过GitHub项目?

是否参与过GitHub或其他同类型网站的iOS开源项目?

请描述一下你的iOS应用开发流程。

是否熟知CocoaPods?它是什么?如何运行的?

请概括一下你对软件授权的理解,及其对软件开发的影响。

请概括一下你在构建iOS应用时的测试过程。iOS应用如何实现对其他语言、日期格式以及货币单位的支持?

请描述一下Instruments及其作用。

二、关于iOS技术

请解释一下Handoff是什么,并简述它是如何实现iOS、Mac/网页应用互通的。

iCloud包含了哪些技术与服务?

iOS扩展是指?能否列举一些热门或常见的范例?

HealthKit是什么?

HomeKit是什么?

Apple Pay是什么?能否描述一下如何在应用中使用Apple Pay?

请解释一下iOS应用沙盒机制。

VoiceOver是什么?请举例解释一下iOS中的辅助功能(Acceibility)。开发者如何使用这些功能?

iOS应用是如何实现后台多任务处理(Multitasking)的?

Game Center针对iOS游戏有哪些功能?

iBeacons是什么?

www.daodoc.com

美国上市公司

亿元级外企IT培训企业

Cocoa/Cocoa Touch是什么?

请概括一下Core Audio,Core Data以及Core Location各是什么。它们对iOS应用有何意义?

请描述SpriteKit和SceneKit的作用。

Metal是什么?

响应链(Responder Chain)是什么?它是如何发挥作用的?

按钮和其他控制方式对哪些操作做出回应?

AppDelegate扮演着什么样的角色?

请解释一下NSUserDefaults。就你而言,你会如何在磁盘中对数组对象进行序列化?

你会如何储存用户的认证信息?

请问何为Keychain服务?

为什么移动设备上的缓存和压缩是不可或缺的?

请解释一下~/Documents,~/Library和~/tmp。 iOS中的~属于什么目录?

AirPlay是如何运行的?换做是你,你会如何通过编程提高应用的实用性以及演示效果?

传感器,IO以及WiFi、拨号等连接方式如何在iOS平台上运作?它们有何利用价值?请扼要地谈谈你的观点。

iPad 2,iPad mini 1-3,iPad Retina,iPad Air 2,iPhone

5、5S、6以及6+在硬件性能方面有何差异?这对注重性能的应用有何限制?

三、关于编程

Cocoa Touch包含什么?不包含什么?

为什么Cocoa Touch的类名称是以两个大写字母开头的?

Swift和Objective-C分别是什么?两者相比有何不同之处,又有何联系?

为什么Optional在Swift语言中非常重要?

请解释一下NSError。在Swift中,什么情况下能使用NSError ,什么情况下不能?

请说明如何使用Instancetype及其重要性。

在Swift中,什么时候该用let,什么时候该用var?

为什么map函数必不可少?该在什么情况下使用它?

你会选择什么工具来追踪Bug?

如果在Cocoa中发现一个Bug,你会如何处理?

如果应用的新版本出现了Regreion的情况,该如何补救?如何防止用户在使用过程中遇到新的Bug?

Objective-C的类是怎么执行的?Objective-C Runtime是如何实现的?

www.daodoc.com

美国上市公司

亿元级外企IT培训企业

iOS是如何提高安全性,保护用户隐私信息的?

应用可以下载并即刻显示数据。如何根据MVC来判断下载的最佳位置?

MVC对代码库(Codebase)的设计有何影响?

Controller Life-Cycle以及View Life-cycle分别有哪些调试方法?

iOS使用的是哪些设计模式(Design Patterns)?你的代码库使用的是哪些设计模式?

iOS提供哪些线程?如何充分利用这些线程?

请简要描述一下UIScrollView的执行过程。它是如何响应手势识别(Gesture Recognizer)、多点触控(Multi-Touch)和Run Loop的?

你认为iOS需要添加或改进哪些API?

四、关于界面

iPhone

5、

6、6+以及iPad Air 2的屏幕分辨率分别是多少?

分辨率的计算单位是什么?

请解释一下Interface Builder的作用以及NIB文件的概念。

iOS UI的图像储存类型是什么?

请描述一下Storyboard和标准NIB文件的差别。

设备状态栏(Device Status Bar)是什么?高度如何?是否透明?在手机通话或者导航状态下,它是如何显示的?

导航栏(Navigation Bar)是什么?能否拿出你的iPhone,指出你下载的哪些应用运用了导航栏?

选项卡(Tab Bar)和工具栏(Toolbar)分别是什么?两者之间有何共同点和不同点?

表视图(Table View)是什么?集合视图(Collection View)又是什么?

什么时候用“弹出(Popover)”属性最为合适?

Split-view Controller是什么?

选取器视图(Picker View)适合存放哪类内容?

应该在什么情况下使用标签、文本域和文本视图?

分段控件(Segmented Control)的作用是什么?

模态视图(Modal View)是什么?

iOS通知属于什么类型?

五、关于设计

iOS应用图标是指什么?请尽可能详细地描述一下。

最小尺寸和最大尺寸的应用图标分别是什么样子的?

应用图标能否包含透明的部分?

www.daodoc.com

美国上市公司

亿元级外企IT培训企业

Newtand的图标与常规应用有何不同?

请解释一下启动画面(Launch Images)。

自动布局(Auto Layout)的作用是什么?请概括一下它是如何运行的。

设计软件时为什么要加上动画?

请描述一下软件设计中的交互和Feedback有什么作用。

设计iPhone和iPad应用时,应分别考虑哪些因素?

请描述一下原型设计对于软件开发的意义。其作用是什么?

六、关于App Store

应用内购买(In-App Purchases)是怎么回事?IAP能够为用户带来哪些新体验?

你是否在App Store上发布过应用?能否概括一下过程?

iTunes Connect是什么?

Provisioning Profiles是指?

App ID是什么?

iOS的开发和发布签名证书有何异同?

如何使用TestFlight?通过Ad-hoc发布应用的话,该如何使用UUID?

应何时验证购买收据?

发布iAds(苹果平台广告)有哪些要求?

七、趣味问答

最近有没有开发什么好玩的东西?你最引以为豪的作品是什么?

谈一谈你常用的开发工具都有哪些优势?

你最敬佩的独立Mac或者iOS应用开发者是谁?

最喜欢什么项目?哪种类型的?

你觉得Xcode有哪些需要改进的地方?

iOS上你最喜欢哪些API?

是否有最中意的错误报告?

你最爱以哪种方式来检验一项新技术是否好用?

为什么词典被称作Dictionaries,而不是HashTable或HashMap?

以上内容来自达内iOS培训机构,更多关于iOS的内容欢迎在线咨询!

推荐第4篇:好程序员ios开发小知识点(二)

、程序启动画面大小

iOS设备现在有三种不同的分辨率:iPhone 320x480、iPhone 4 640x960、iPad 768x1024。以前程序的启动画面(图片)只要准备一个 Default.png 就可以了,但是现在变得复杂多了。下面就是 CocoaChina 会员做得总结

如果一个程序,既支持iPhone又支持iPad,那么它需要包含下面几个图片: Default-Portrait.png iPad专用竖向启动画面 768x1024或者768x1004 Default-Landscape.png iPad专用横向启动画面 1024x768或者1024x748 Default-PortraitUpsideDown.png iPad专用竖向启动画面(Home按钮在屏幕上面),可省略 768x1024或者768x1004 Default-LandscapeLeft.png iPad专用横向启动画面,可省略 1024x768或者1024x748 Default-LandscapeRight.png iPad专用横向启动画面,可省略 1024x768或者1024x748 Default.png iPhone默认启动图片,如果没有提供上面几个iPad专用启动图片,则在iPad上运行时也使用Default.png(不推荐) 320x480或者320x460 Default@2x.png iPhone4启动图片640x960或者640x920 为了在iPad上使用上述的启动画面,你还需要在info.plist中加入key: UISupportedInterfaceOrientations。同时,加入值UIInterfaceOrientationPortrait, UIInterfacOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight

17、ASIHTTPRequest实现断点下载

- (IBAction)URLFetchWithProgre:(id)sender { [startButton setTitle:@\"Stop\" forState:UIControlStateNormal]; [startButton addTarget:self action:@selector(stopURLFetchWithProgre:)forControlEvents:UIControlEventTouchUpInside]; NSString*tempFile = [[[[NSBundle mainBundle] bundlePath]stringByDeletingLastPathComponent]stringByAppendingPathComponent:@\"MemexTrails_1.0b1.zip.download\"]; if ([[NSFileManager defaultManager] fileExistsAtPath:tempFile]) { [[NSFileManager defaultManager] removeItemAtPath:tempFile error:nil]; } [self resumeURLFetchWithProgre:self]; }(IBAction)resumeURLFetchWithProgre:(id)sender { [resumeButton setEnabled:NO]; [startButton setTitle:@\"Start\" forState:UIControlStateNormal]; [startButton addTarget:self action:@selector(stopURLFetchWithProgre:)forControlEvents:UIControlEventTouchUpInside]; [networkQueue cancelAllOperations]; [networkQueue setShowAccurateProgre:YES]; [networkQueue setDownloadProgreDelegate:progreIndicator]; [networkQueue setDelegate:self]; [networkQueue setRequestDidFinishSelector:@selector(URLFetchWithProgreComplete:)]; ASIHTTPRequest*request=[[[ASIHTTPRequest alloc] initWithURL:[NSURLURLWithString:@\"http://9991.net/blog/mp3/2.mp3\"]] autorelease]; [request setDownloadDestinationPath:[[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@\"MemexTrails_1.0b1.mp3\"]]; [request setTemporaryFileDownloadPath:[[[[NSBundle mainBundle] bundlePath]stringByDeletingLastPathComponent]stringByAppendingPathComponent:@\"MemexTrails_1.0b1.zip.down\"]]; [request setAllowResumeForFileDownloads:YES]; [networkQueue addOperation:request];

}(IBAction)throttleBandwidth:(id)sender { if ([(UIButton *)sender state] ==YES) { [ASIHTTPRequest setMaxBandwidthPerSecond:ASIWWANBandwidthThrottleAmount]; } else { [ASIHTTPRequest setMaxBandwidthPerSecond:]; } }

18、Safari 启动本地app

在plist文件中加入URL types 结构如下图,在Safari中地址栏输入 设置的字符串,比如设置的是

QQ,地址栏输入 QQ:// 就可以起点本地应用。

19、拖到视频进度与滑动手势冲突解决办法

#pragma mark10.1.x system */ } else if (floor(NSAppKitVersionNumber)

  } else { /* 10.6 or later system */ } 跟以上一样在 NSObjCRuntime.h中用定义了NSFoundationVersionNumber全局常量 小结:详解IOS SDK兼容性引导的内容介绍玩玩了,希望通过本文的学习能对你有所帮助! 原文地址:http://blog.csdn.net/diyagoanyhacker/article/details/6673344

26、NSDate 与 NSString 转换

1、将字符串 “Fri Nov 11 09:06:27 +0800 2011” 转换成Date: NSDateFormatter *format = [[NSDateFormatter alloc] init]; NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@\"en-US\"]; [format setLocale:enLocale]; [enLocale release]; [format setDateFormat:@\"EEE MMM dd HH:mm: ZZZ yyyy\"]; NSDate *dateTime = [format dateFromString:meage];

将Date转换成字符串: NSDate *date = [NSDate date]; NSString * dateString = [format stringFromDate:date]; //字符串转换成NSDate 需要设置NSLocale 否则真机上会失败。

2、获取当前时间,转化成字符串

NSDateFormatter * formatter = [[NSDateFormatteralloc]init]; formatter.dateStyle = NSDateFormatterMediumStyle; formatter.timeStyle = NSDateFormatterMediumStyle; formatter.locale = [NSLocalecurrentLocale]; self.timeLabel.text = [formatterstringFromDate:[NSDatedate]];

3、获取月、日、年、时、分、秒

NSDateFormatter *formatter =[[[NSDateFormatteralloc] init] autorelease]; formatter.dateStyle = NSDateFormatterMediumStyle; formatter.timeStyle = NSDateFormatterMediumStyle; formatter.locale = [NSLocalecurrentLocale];

NSDate *date = [NSDatedate];

[formatter setTimeStyle:NSDateFormatterMediumStyle]; NSCalendar *calendar = [[[NSCalendaralloc] initWithCalendarIdentifier:NSGregorianCalendar]autorelease]; NSDateComponents *comps = [[[NSDateComponentsalloc] init] autorelease]; NSInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; //int week=0; comps = [calendar components:unitFlags fromDate:date]; int week = [comps weekday]; int year=[comps year]; int month = [comps month]; int day = [comps day]; [formatter setDateStyle:NSDateFormatterMediumStyle]; // //This sets the label with the updated time.int hour = [comps hour]; int min = [comps minute]; int sec = [comps second];

NSLog(@\"day%d\",day); NSLog(@\"hour%d\",hour); NSLog(@\"min%d\",min); NSLog(@\"sec%d\",sec);

27、数组中存储数据查询

NSMutableDictionary *userDic1 = [NSMutableDictionary dictionaryWithCapacity:10]; NSMutableDictionary *userDic2 = [NSMutableDictionary dictionaryWithCapacity:10]; [userDic1 setValue:@\"Li\" forKey:@\"name\"];

NSArray *userArray = [NSArray arrayWithObjects:userDic1,userDic2,nil]; NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@\"SELF.name contains[cd] %@ \",@\"L\"];

NSMutableArray *searchArray = [NSMutableArray arrayWithArray:[userArray filteredArrayUsingPredicate:namePredicate]];

NSLog(@\"searchArray == %@\",searchArray);

28、CoreText 总结

(1) NSAttributedString NSAttributedString 可以将一段文字中的部分文字设置单独的字体和颜色。 与UITouch结合可以实现点击不同文字触发不同事件的交互功能。 主要方法:

- (void)addAttribute:(NSString *)name value:(id)value range:(NSRange)range; 可以设置某段文字的字体名称,颜色,下滑线等信息。

- (void)removeAttribute:(NSString *)name range:(NSRange)range; 移除之前设置的字体属性值。

- (void)addAttributes:(NSDictionary *)attrs range:(NSRange)range; 存储某段文字包含的信息(包括字体属性或其它,也可以存储一些自定义的信息) - (NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range; 通过location来获取某段文字中之前存储的信息NSDictionary

//设置字体

CTFontRef aFont = CTFontCreateWithName((CFStringRef)textFont.fontName, textFont.pointSize, NULL); if (!aFont) return; CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits(aFont, 0.0, NULL, kCTFontItalicTrait, kCTFontBoldTrait); //将默认黑体字设置为其它字体 [self removeAttribute:(NSString*)kCTFontAttributeName range:textRange]; [self addAttribute:(NSString*)kCTFontAttributeName value:(id)newFont range:textRange]; CFRelease(aFont); CFRelease(newFont);

//设置字体颜色

[self removeAttribute:(NSString*)kCTForegroundColorAttributeName range:textRange]; [self addAttribute:(NSString*)kCTForegroundColorAttributeName value:(id)textColor.CGColor range:textRange];

//设置对齐 换行

CTTextAlignment coreTextAlign = kCTLeftTextAlignment; CTLineBreakMode coreTextLBMode = kCTLineBreakByCharWrapping; CTParagraphStyleSetting paraStyles[2] = { {.spec = kCTParagraphStyleSpecifierAlignment, .valueSize = sizeof(CTTextAlignment), .value = (const void*)&coreTextAlign}, {.spec = kCTParagraphStyleSpecifierLineBreakMode, .valueSize = sizeof(CTLineBreakMode), .value = (const void*)&coreTextLBMode}, }; CTParagraphStyleRef aStyle = CTParagraphStyleCreate(paraStyles, 2); [self removeAttribute:(NSString*)kCTParagraphStyleAttributeName range:textRange]; [self addAttribute:(NSString*)kCTParagraphStyleAttributeName value:(id)aStyle range:textRange]; CFRelease(aStyle);

(2)Draw NSAttributedString

CGContextRef cgc = UIGraphicsGetCurrentContext(); CGContextSaveGState(cgc);

//图像方向转换

CGContextConcatCTM(cgc, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, self.bounds.size.height), 1.f, -1.f));

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)weiBoText);

CGMutablePathRef path = CGPathCreateMutable(); CGPathAddRect(path, NULL, drawingRect); textFrame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0,0), path, NULL); CGPathRelease(path); CFRelease(framesetter);

CTFrameDraw(textFrame, cgc); CGContextRestoreGState(cgc); (3)图文混排

CTFrameRef textFrame // coreText 的 frame CTLineRef line // coreText 的 line CTRunRef run // line 中的部分文字 相关方法:

CFArrayRef CTFrameGetLines (CTFrameRef frame ) //获取包含CTLineRef的数组 void CTFrameGetLineOrigins( CTFrameRef frame, CFRange range, CGPoint origins[] ) //获取所有CTLineRef的原点

CFRange CTLineGetStringRange (CTLineRef line ) //获取line中文字在整段文字中的Range CFArrayRef CTLineGetGlyphRuns (CTLineRef line ) //获取line中包含所有run的数组 CFRange CTRunGetStringRange (CTRunRef run ) //获取run在整段文字中的Range CFIndex CTLineGetStringIndexForPosition( CTLineRef line, CGPoint position ) //获取点击处position文字在整段文字中的index CGFloat CTLineGetOffsetForStringIndex( CTLineRef line, CFIndex charIndex, CGFloat* secondaryOffset ) //获取整段文字中charIndex位置的字符相对line的原点的x值 主要步骤:

1)计算并存储文字中保含的所有表情文字及其Range 2)替换表情文字为指定宽度的NSAttributedString

callbacks.version = kCTRunDelegateVersion1; callbacks.getAscent = ascentCallback; callbacks.getDescent = descentCallback; callbacks.getWidth = widthCallback; callbacks.dealloc = deallocCallback;

CTRunDelegateRef runDelegate = CTRunDelegateCreate(&callbacks, NULL); NSDictionary *attrDictionaryDelegate = [NSDictionary dictionaryWithObjectsAndKeys: (id)runDelegate, (NSString*)kCTRunDelegateAttributeName, [UIColor clearColor].CGColor,(NSString*)kCTForegroundColorAttributeName, nil];

NSAttributedString *faceAttributedString = [[NSAttributedString alloc] initWithString:@\"*\" attributes:attrDictionaryDelegate];

[weiBoText replaceCharactersInRange:faceRange withAttributedString:faceAttributedString]; [faceAttributedString release]; 3) 根据保存的表情文字的Range计算表情图片的Frame textFrame 通过CTFrameGetLines 获取所有line的数组 lineArray 遍历lineArray中的line通过CTLineGetGlyphRuns获取line中包含run的数组 runArray 遍历runArray中的run 通过CTRunGetStringRange获取run的Range 判断表情文字的location是否在run的Range 如果在 通过CTLineGetOffsetForStringIndex获取x的值 y的值为line原点的值 4)Draw表情图片到计算获取到的Frame

(3)点击文字触发事件

主要步骤:

1) 根据touch事件获取点point 2) textFrame 通过CTFrameGetLineOrigins获取所有line的原点 3) 比较point和line原点的y值获取点击处于哪个line 4) line、point 通过CTLineGetStringIndexForPosition获取到点击字符在整段文字中的 index

5) NSAttributedString 通过index 用方法-(NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range 可以获取到点击到的NSAttributedString中存储的NSDictionary 6) 通过NSDictionary中存储的信息判断点击的哪种文字类型分别处理

推荐第5篇:黑马程序员:IOS面试宝典之第三方框架

黑马程序员:IOS面试宝典之第三方框架

面试常问,你经常使用一些第三方库吗?比如AFNetworking SDWebimage JsonModel等,有没有去了解过里面的实现原理? 第三方框架

1.关于cocoaPods的问题:

1.1.使用过 CocoaPods 吗?它是什么? CocoaPods的原理? CocoaPod是一个第三方库的管理工具,用来管理项目中的第三方框架。

在终端中进入(cd命令)你项目所在目录,然后在当前目录下,利用vim创建Podfile,运行: $ vim Podfile 然后在Podfile文件中输入以下文字: platform :ios, \'9.2\'

pod \"SDWebImage\", \"~>2.0”

然后保存退出。vim环境下,保存退出命令是 :wq

这时候,你会发现你的项目目录中,出现一个名字为Podfile的文件,而且文件内容就是你刚刚输入的内容。

这时候,你就可以利用CocoPods下载AFNetworking类库了,运行以下命令:$ pod install 1.2.用cocopod管理第三方框架的时候我想改版本,怎么办到?

可以直接或者终端打开Podfile, 修改Podfile文件中第三方框架的版本

2.关于SDWebImage的问题: 2.1.SDWebImage的原理实现机制如何解决TableView卡的问题?

SDWebImage内部实现过程

1>入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片。

2>进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache 从缓存查找图片是否已经下载 queryDiskCacheForKey:delegate:userInfo:.3>先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。

4>SDWebImageManagerDelegate 回调 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片。

5>如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。

6>根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:。

7>如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。

8>如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片, 回调 imageCache:didNotFindImageForKey:userInfo:。

9>共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片。

10>图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。

11>connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果。

12>connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理。

13>图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。 14>在主线程 notifyDelegateOnMainThreadWithInfo:

宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader。 15>imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成。

16>通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。

17>将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程。

18>SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。

19>SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。 20>SDWebImagePrefetcher 可以预先下载图片,方便后续使用。 如何解决tableView卡 , 通过设置最大并发数, 设置当前页的cell, 而不是把所有cell一次性设置完, 以及数据图片的三级缓存, 直接保存在内存中和沙盒缓存中进行读取.降低网络请求的次数, 不仅节约用户流量.也会保证tableView滑动的流畅性

2.2.SDWebImage怎样实现图片的缓存机制的?

图片的缓存, 内存缓存, 沙盒缓存, 操作缓存, 以tableViewController为例: 每次cell需要显示,都需要重新调用- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { }方法 每次调用tableView显示行的数据源方法时, 如果需要从网络加载图片, 就需要将加载图片这样的耗时操作放在子线程上执行, 从网络上下载的图片可以以键值对的形式保存在定义的可变字典中 ,将每张图片的唯一的路径作为键,将从网络下载下来的图片作为值, 保存在内存缓存中, 这样每次滑动tableView cell重用时就直接判断内存缓存中有没有需要的图片, 如果有就不需要再次下载,在没有出现内存警告或者程序员手动清理内存缓存时, 就直接从内存缓存中获取图片. 为了每次退出程序,再次进入程序时, 不浪费用户的流量, 需要将第一次进入程序时加载的图片保存在本地沙盒缓存文件中, 在沙盒中保存的图片数据没有被改变之前, 下次开启程序就直接从沙盒的缓存文件中读取需要显示的图片, 并将沙盒缓存文件夹(Cache)中保存的图片保存到内存缓存中, 这样用户每次滑动tableView cell重用时直接从内存缓存中读取而不是从沙盒中读取, 节约时间.

推荐第6篇:黑马程序员:IOS面试宝典之OC语言

OC语言(★★)

有人可能会问对于我们学iOS的同学来讲,面试还会问Objective-C基础吗?答案是会的,但是不会太多,因此我给了两颗星的重要程度。一般笔试的时候出现Objective-C基础题的概率比较大,口头面试的时候比较少,比如自己在面试的时候一些对基础知识比较看重的面试官会深究着Objective-C基础去问,比如Objective-C内存管理等等。

一、Objective-C语法

1.面向对象都有哪些特性以及你对这些特性的理解

继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。

封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。

多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A

系统来说都是透明的。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1.方法重写(子类继承父类并重写父类中已有的或抽象的方法);2.对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。

抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

2.我们说的Objective-C是动态运行时语言是什么意思? (When we call objective c is runtime language what does it mean?) 主要是将数据类型的确定由编译时,推迟到了运行时。这个问题其实浅涉及到两个概念,运行时和多态。简单来说, 运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。多态:不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat;那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。因此也可以说,运行时机制是多态的基础.3.readwrite,readonly, aign,retain,copy,nonatomic, strong, weak属性的作用?并区别strong(强引用)、weak(弱引用)?什么情况使用copy,aign和retain? readwrite 是可读可写特性;需要生成getter方法和setter方法时;

readonly 是只读特性只会生成getter方法不会生成setter方法,不希望属性在类外改变;

aign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;, aign用于简单数据类型,如NSInteger,double,bool; retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;

copy 表示赋值特性,setter方法将传入对象复制一份;需要完全一份新的变量时; nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作; atomic表示多线程安全,一般使用nonatomic。

retain 和copy用户对象,copy用于当 a指向一个对象, b也想指向同样的对象的时候,如果用aign,a如果释放,再调用b会crash,如果用copy 的方式,a和b各自有自己的内存,就可以解决这个问题。retain 会使计数器加1,也可以解决aign的问题。另外:atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。

其实从这个也可以引申到内存管理的一系列问题.面试官会让你讲讲MRC和ARC的理解,随即也引申出Block的内存机制,为啥推荐Block用copy,Block会存在哪些内存问题?循环引用?

4.分别描述内存管理要点、autorelease、release、NSAutoreleasePool?并说明autorelease是什么时候被release的?简述什么时候由你负责释放对象,什么时候不由你释放?[NSAutoreleasePool release]和[NSAutoreleasePool drain]有什么区别? 内存管理要点: Objective-C 使用引用计数机制(retainCount)来管理内存。内存每被引用一次,该内存的引用计数+1,每被释放一次引用计数-1。当引用计数 = 0 的时候,调用该对象的 dealloc 方法,来彻底从内存中删除该对象。 alloc,allocWithZone,new(带初始化)时:该对象引用计数 +1;

retain:手动为该对象引用计数 +1; copy:对象引用计数 +1;

mutableCopy:生成一个新对象,新对象引用计数为 1; release:手动为该对象引用计数 -1;

autorelease:把该对象放入自动释放池,当自动释放池释放时,其内的对象引用计数 -1。

NSAutoreleasePool: NSAutoreleasePool是通过接收对象向它发送的autorelease消息,记录该对象的release消息,当自动释放池被销毁时,会自动向池中的对象发送release消息。autorelease 是在自动释放池被销毁,向池中的对象发送release只能释放自己拥有的对象, 区别是:在引用计数环境下(在不使用ARC情况下),两者基本一样,在GC(垃圾回收制)环境下,release 是一个no-op(无效操作),所以无论是不是GC都使用drain

面试中内存管理,release和autorelease的含义?这里尤其要强调下autorelease,它引申出自动释放池,也能引申出Run loop! 5.自动释放池是什么,如何工作 ? 当 您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。

1>.Objective-C 是 通过一种\"referring counting\"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为1,以后每当碰到有copy,retain的时候引用计数都会加1, 每当碰到release和autorelease的时候引用计数就会减1,如果此对象的计数变为了0, 就会被系统销毁.2>.NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用自己管理.3>.autorelease和release没什么区别,只是引用计数减1的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减1.6.IPhone OS有没有垃圾回收?autorelease 和垃圾回收制(gc)有什么关系? IPhone OS 中没有垃圾回收。autorelease只是延迟释放,gc是每隔一段时间询问程序,看是否有无指针指向的对象,若有,就将它回收。他们两者没有什么关系。

7.简述NotificationCenter、KVC、KVO、Delegate?并说明它们之间的区别? KVO(Key-Value- Observing):是键值监听,键值观察机制,当观察者为一个对象的属性进行了注册,被观察对象的isa指针被修改的时候,isa指针就会指向一个中间类,而不是真实的类。所以 isa指针其实不需要指向实例对象真实的类。所以我们的程序最好不要依赖于isa指针。在调用类的方法的时候,最好要明确对象实例的类名

KVC(Key-Value-Coding)内部的实现:是键值编码,一个对象在调用setValue的时候,(1)首先根据方法名找到运行方法的时候所需要的环 境参数。(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。(3)再直接查找得来的具体的方法实现。 Delegate:代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate同意然然后发送者响应事件,delegate机制使得接收者可以改变发送者的行为。通常发送者和接收者的关系是直接的一对多的关系。

Notification:消息的发送者告知接收者事件已经发生或者将要发送,仅此而已,接收者并不能反过来影响发送者的行为。通常发送者和接收者的关系是间接的多对多关系。

1).效率肯定是delegate比nsnotification高。

2).delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值,也就是delegate方法的结果。比如-windowShouldClose:,需要关心返回的是yes还是no。所以delegate方法往往包含should这个很传神的词。也就是好比你做我的delegate,我会问你我想关闭窗口你愿意吗?你需要给我一个答案,我根据你的答案来决定如何做下一步。相反的,notification最大的特色就是不关心接受者的态度,我只管

把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。所以notification往往用did这个词汇,比如NSWindowDidResizeNotification,那么nswindow对象放出这个notification后就什么都不管了也不会等待接受者的反应。

1)两个模块之间联系不是很紧密,就用notification传值,例如多线程之间传值用notificaiton。

2)delegate只是一种较为简单的回调,且主要用在一个模块中,例如底层功能完成了,需要把一些值传到上层去,就事先把上层的函数通过delegate传到底层,然后在底层call这个delegate,它们都在一个模块中,完成一个功能,例如说 NavgationController 从 B 界面到A 点返回按钮 (调用popViewController方法) 可以用delegate比较好。

What is lazy loading? 就是懒汉模式,只在用到的时候才去初始化。也可以理解成延时加载。我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。一个延时载,避免内存过高,一个异步加载,避免线程堵塞。

9.OC有多继承吗?没有的话可以用什么方法替代? 多继承即一个子类可以有多个父类,它继承了多个父类的特性。Object-c的类没有多继承,只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现,OC类似于多继承,是在用protocol委托代理来实现的;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

10.分别描述类别(categories)和延展(extensions)是什么?以及两者的区别?继承和类别在实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量? 类别:在没有原类.m文件的基础上,给该类添加方法;

延展:一种特殊形式的类别,主要在一个类的.m文件里声明和实现延展的作用,就是给某类添加私有方法或是私有变量。两个的区别:延展可以添加属性并且它添加的方法是必须要实现的。延展可以认为是一个私有的类目。

继承和类别在实现中的区别:类别可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。 Category只能为对象添加方法,却不能添加成员变量的原因:如果可以添加成员变量,添加的成员变量没有办法初始化

11.Objective-C有私有方法么?私有变量呢?如多没有的话,有没有什么代替的方法? objective-c类里面的方法只有两种, 静态方法和实例方法.但是可以通过把方法的声明和定义都放在.m文件中来实现一个表面上的私有方法。有私有变量,可以通过@private来修饰,或者把声明放到.m文件中。在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的

12.#include与#import的区别? #import与@cla的区别? #import指令是Object-C针对#include的改进版本,#import确保引用的文件只会被引用一次,这样你就不会陷入递归包含的问题中。

#import与@cla二者的区别在于:

1>#import会链入该头文件的全部信息,包括实体变量和方法等;而@cla只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑。

2>在头文件中,一般只需要知道被引用的类的名称就可以了。不需要知道其内部的实体变量和方法,所以在头文件中一般使用@cla来声明这个名称是类的名称。而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。

3>在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@cla则不会。

4>如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@cla在两个类的头文件中相互声明,则不会有编译错误出现。所以,一般来说,@cla是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要import在@cla中声明的类进来.

13.浅复制和深复制的区别? (Difference between shallow copy and deep copy?) 浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身。意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。

深层复制(mutableCopy):复制引用对象本身。深复制就好理解了,内存中存在了两份独立对象本身,当修改A时,A_copy不变。

用网上一哥们通俗的话将就是:

浅复制好比你和你的影子,你完蛋,你的影子也完蛋

深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。

14.类变量的@protected,@private,@public,@package声明各有什么含义? 变量的作用域不同,@protected 该类和所有子类中的方法可以直接访问这样的变量,这是默认的;@private 该类中的方法可以访问这样的变量,子类不可以; @public除了自己和子类方法外,也可以被其他类或者其他模块中的方法访问;@package 目前尚未得出结论.

15.static 关键字的作用? 1>函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次, 因此其值在下次调用时仍维持上次的值;

2>在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;

3>在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明 它的模块内;

4>在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;

5>在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量

16.关键字volatile有什么含意?并给出三个不同的例子

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

• 并行设备的硬件寄存器(如:状态寄存器)

• 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) • 多线程应用中被几个任务共享的变量

17.Objective-C与C、C+++之间的联系和区别?

Objective-C和C++都是C的面向对象的超集。

Object与C++的区别主要点:Objective-C是完全动态的,支持在运行时动态类型决议(dynamic typing),动态绑定(dynamic binding)以及动态装载(dynamic loading);而C++是部分动态的,编译时静态绑定,通过嵌入类(多重继承)和虚函数(虚表)来模拟实现。

Objective-C 在语言层次上支持动态消息转发,其消息发送语法为 [object function];而且C++ 为 object->function()。两者的语义也不同,在 Objective-C 里是说发送消息到一个对象上,至于这个对象能不能响应消息以及是响应还是转发消息都不会 crash;而在 C++ 里是说对象进行了某个操作,如果对象没有这个操作的话,要么编译会报错(静态绑定),要么程序会 crash 掉的(动态绑定)。

18.目标-动作机制

目标是动作消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参见\"插座变量\"部分)的形式保有其动作消息的目标。

动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法.程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制。

19.动态绑定

在运行时确定要调用的方法 , 动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的调用并不和代码绑定在一起,只有在消实发送出来之后,才确定被调用的代码。通过

动态类型和动态绑 定技术,代码每次执行都可以得到不同的结果。运行时因子负责确定消息的接收者和被调用的方法。运行时的消息分发机制为动态绑定提供支持。当向一个动态类型确定了的对象发送消息时,运行环境系统会通过接收者的isa指针定位对象的类,并以此为起点确定被调用的方法,方法和消息是动态绑定的。而且,不必在Objective-C 代码中做任何工作,就可以自动获取动态绑定的好处。在每次发送消息时,特别是当消息的接收者是动态类型已经确定的对象时,动态绑定就会例行而透明地发生

20.iPad开发与iPhone开发有什么不同?

开发iPad和iPhone应用使用的是相同的SDK,它们之间的区别主要体现在设备硬件和UI操作上。

(1)设备硬件:由于iPad不具备电话功能,iPad1也没有相机,所以相关的特性如电话、SMS等无法使用。

(2)UI操作:由于iPad屏幕大小为9.7英寸,而iPhone的屏幕是3.5英寸,这就决定了两者操作方式的不同。有些控件,如UIPopoverController, UISliptViewController 只能在iPad中使用,而不能在iPhone中使用;而且当需要presentModalViewController时,Window presentation style 只对iPad有效;除此之外,iPad产品开发中还需针对iPad大屏幕考虑加入多指手势以增加用户体验

21.换肤技术使用了什么技术? 22.谈谈你对runtime的了解? 23.算法和数据结构

推荐第7篇:黑马程序员:IOS面试宝典之关于动画

关于动画

1.谈谈你对Core Graphic 绘图的了解? CoreGraphics也称为Quartz 2D 是UIKit下的主要绘图系统,频繁的用于绘制自定义视图。Core Graphics是高度集成于UIView和其他UIKit部分的。Core Graphics数据结构和函数可以通过前缀CG来识别。

视图可以通过子视图、图层或实现drawRect:方法来表现内容,如果说实现了drawRect:方法,那么最好就不要混用其他方法了,如图层和子视图。自定义绘图大部分是由UIKit或者Core Graphics来实现的。

2D绘图一般可以拆分成以下几个操作: 线条 , 路径 , 文本 , 图片 , 渐变 由于像素是依赖于目标的,所以2D绘图并不能操作单独的像素,我们可以从上下文(Context)读取它。

绘图就好比在画布上拿着画笔机械的进行画画,通过制定不同的参数来进行不同的绘制。

http://www.daodoc.com/articles/jIJzMf

http://blog.csdn.net/mangosnow/article/details/37054765

2.Core Animation(核心动画)? CoreAnimation也就是核心动画, 是一组非常强大的动画处理API, 可以使用少量

的代码做出绚丽的效果, 是直接作用在CALayer上的, 并非UIView, 并且Core Animation的动画执行过程都是在后台操作, 不会阻塞主线程.所有动画都是作用在CALayer上的, 当把动画添加到Layer上, 是不直接修改它的属性, Core Animation维护了两个平行layer的层次结构, 模型层树可以看到Layer的状态, 表示层树则是动画正在表现的值的近似.Core Animation的使用步骤: 1>使用它需要先添加QuartzCore.framework框架和引入主头文件(iOS7.0+ 不需要) 2>.初始化一个CAAnimation对象,并设置一些动画相关属性

3>.通过调用CALayer的addAnimation:forKey:方法增加CAAnimation对象到CALayer中,这样就能开始执行动画了

4>.通过调用CALayer的removeAnimationForKey:方法可以停止CALayer中的动画

1.转场动画? CATransition-转场动画, 作为CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点. UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果.如下是转场动画的过渡效果:

使用UIView的动画函数, 实现转场动画 1>单视图:

+(void)transitionWithView:(UIView*)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options

animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion; 参数说明:

duration:动画的持续时间 view:需要进行转场动画的视图 options:转场动画的类型

animations:将改变视图属性的代码放在这个block中 completion:动画结束后,会自动调用这个block 2>双视图: +(void)transitionFromView:(UIView*)fromView toView:(UIView*)toView

duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options finished))completion; 参数说明:

duration:动画的持续时间 options:转场动画的类型

animations:将改变视图属性的代码放在这个block中 completion:动画结束后,会自动调用这个block

completion:(void

(^)(BOOL 2.一个动画怎么实现? 以转场动画为例: 1>创建CATransition对象

CATransition *animation = [CATransition animation]; 2>设置运动时间(即动画时间) animation.duration = DURATION; 3>设置运动type(类型)

animation.type = type; if (subtype != nil) { 4>设置子类 (和type配合使用, 指定运动的方向) animation.subtype = subtype; } 5>设置运动速度(动画的运动轨迹,用于变化起点和终点之间的插值计算,形象点说它决定了动画运行的节奏,比如是均匀变化(相同时间变化量相同)还是先快后慢,先慢后快还是先慢再快再慢) animation.timingFunction = UIViewAnimationOptionCurveEaseInOut;

6>将动画添加到view的Layer层

[view.layer addAnimation:animation forKey:@\"animation\"]; 动画类型如下: typedef enum : NSUInteger { Fade = 1, //淡入淡出 Push, //推挤 Reveal, //揭开 MoveIn, //覆盖 Cube, //立方体 SuckEffect, //吮吸 OglFlip, //翻转 RippleEffect, //波纹

PageCurl, //翻页 PageUnCurl, //反翻页 CameraIrisHollowOpen, //开镜头 CameraIrisHollowClose, //关镜头 CurlDown, //下翻页 CurlUp, //上翻页 FlipFromLeft, //左翻转 FlipFromRight, //右翻转 } AnimationType; 3.CADisplayLink CADisplayLink是一种以屏幕刷新频率触发的时钟机制,每秒钟执行大约60次左右

CADisplayLink是一个计时器,可以使绘图代码与视图的刷新频率保持同步,而NSTimer无法确保计时器实际被触发的准确时间 使用方法:

定义CADisplayLink并制定触发调用方法 将显示链接添加到主运行循环队列

推荐第8篇:黑马程序员:IOS面试宝典之c语言

黑马程序员:IOS面试宝典之c语言

C语言语法

1.局部变量能否和全局变量重名?

答:能,局部会屏蔽全局。要用全局变量,需要使用\"::\" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同 名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

2.如何引用一个已经定义过的全局变量?

答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期 间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

3.全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

答:可以,在不同的C文件中以static形式来声明同名全局变量。

可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错.

4.关键字volatile有什么含意?并举出三个不同的例子?

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

1) 并行设备的硬件寄存器(如:状态寄存器)

2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3) 多线程应用中被几个任务共享的变量

5.static 关键字的作用是什么?

(1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,

因此其值在下次调用时仍维持上次的值;

(2)在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;

(3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明

它的模块内;

(4)在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;

(5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。

6.堆和栈的区别是什么?

管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。

申请大小:栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统 预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示 overflow。因此,能从栈获得的空间较小。堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地 址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个 问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出 分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由 alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的 效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的

7.static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?

答: 1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。

2) 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

3) static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件

综上所述: static全局变量与普通的全局变量有什么区别:

static全局变量只初使化一次,防止在其他文件单元中被引用;

static局部变量和普通局部变量有什么区别:

static局部变量只被初始化一次,下一次依据上一次结果值;

static函数与普通函数有什么区别:

static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

8.关键字const的作用分别是什么?

const int a; int const a; const int *a; int const *a; int * const a; int const * const a; 1>前两个的作用是一样:a 是一个常整型数

2>第

三、四个意味着 a 是一个指向常整型数的指针(整型数是不可修改的,但指针可以) 3>第五个的意思:a 是一个指向整型数的常指针(指针指向的整型数是可以修改的,但指针是不可修改的) 4>最后一个意味着:a 是一个指向常整型数的常指针(指针指向的整型数是不可修改的,同时指针也是不可修改的) 9.struct与union的区别是什么?

设有以下说明和定义:

typedef union

{ long i; int k[5]; char c; } DATE;

struct data { int cat; DATE cow; double dog; } too;

DATE max;

则语句 printf(\"%d\",sizeof(struct data)+sizeof(max));的执行结果是:___52____ 考点:区别struct与union.(一般假定在32位机器上)

答:DATE是一个union, 变量公用空间.里面最大的变量类型是int[5], 占用20个字节.所以它的大小是20.data是一个struct, 每个变量分开占用空间.依次为int4 + DATE20 + double8 = 32.所以结果是 20 + 32 = 52.当然...在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 20 10.关于指针的理解

1.请写出下题输出结果:

1.Main(){ 2.Int a[5] = {1,2,3,4,5};

3.Int *ptr = (int *)(&a+1); 4.Printf(“%d,%d”,*(a+1),*(ptr – 1)); 5.} 答:2,5

*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2.5,&a+1不是首地址+1,系统会认为加一个a数组的偏 移,是偏移了一个数组的大小(本例是5个int,int *ptr=(int *)(&a+1);则ptr实际 是&(a[5]),也就是a+5原因如下:

&a是数组指针,其类型为 int (*)[5];而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。a是长度为5的int数组指针,所以要加 5*sizeof(int)所以ptr实际是a[5],但是prt与(&a+1)类型是不一样的(这点很重要),所以prt-1只会减去sizeof(int*),a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].2.写出下列代码的输出内容

#include

int inc(int a)

{ return(++a); }

int multi(int*a,int*b,int*c)

{

return(*c=*a**b); }

typedef int(FUNC1)(int in);

typedef int(FUNC2) (int*,int*,int*);

void show(FUNC2 fun,int arg1, int*arg2)

{

FUNC1 p=&inc;

int temp =p(arg1);

fun(&temp,&arg1, arg2);

printf(\"%dn\",*arg2);

}

main()

{

int a;

//局部变量a为0;

show(multi,10,&a);

return 0;

}

答:110

3.以下为Windows NT下的32位C++程序,请计算sizeof的值void Func ( char str[100] ) {

sizeof( str ) = ? } void *p = malloc( 100 ); sizeof ( p ) = ? 答案:这题 很常见了,Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等 操作,可以被修改。Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str )、sizeof ( p ) 都为4。

推荐第9篇:黑马程序员:IOS面试宝典之UITableView与UICollectionView

黑马程序员:IOS面试宝典之UITableView与UICollectionView 1.UITableView的重用机制?(或者如何在一个view上显示多个tableView,tableView要求不同的数据源以及不同的样式 (要求自定义cell), 如何组织各个tableView的delegate和dataSource?请说说实现思路?) 查看UITableView头文件,会找到NSMutableArray*visiableCells,和NSMutableArray*reusableTableCells两 个结构。visiableCells内保存当前显示的cells,reusableTableCells保存可重用的cells。TableView显示之初,reusableTableCells为空,那么tableView dequeueReusableCellWithIdentifier:CellIdentifier返回nil。开始的cell都是通过 [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] 来创 建,而且cellForRowAtIndexPath只是调用最大显示cell数的次数。 比如:有100条数据,iPhone一屏最多显示10个cell。程序最开始显示TableView的情况是: 1.用[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] 创建10次cell,并给cell指定同样的重用标识(当然,可以为不同显示类型的cell指定不同的标识)。并且10个cell全部都加 入到 visiableCells数组,reusableTableCells为空。

2.向下拖动tableView,当cell1完全移出屏幕,并且 cell11(它也是alloc出来的,原因同上)完全显示出来的时候。 cell11加入到visiableCells,cell1移出 visiableCells,cell1加入到reusableTableCells。

3.接着向下拖动tableView,因为reusableTableCells中已 经有值,所以,当需要显示新的cell, cellForRowAtIndexPath再次被调用的时 候,tableView dequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。 cell1加入到visiableCells,cell1 移出reusableTableCells;cell2移出 visiableCells,cell2加入到reusableTableCells。之后再需要显示的Cell就可 以正常重用了

2.在一个tableView 中需要自定义多种样式的cell(两种或三种),通常你如何实现,说说思路即可? 比如:有100条数据,iPhone一屏最多显示10个cell。程序最开始显示TableView的情况是: 1.用[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] 创建10次cell,并给cell指定同样的重用标识(当然,可以为不同显示类型的cell指定不同的标识)。并且10个cell全部都加 入到 visiableCells数组,reusableTableCells为空。

2.向下拖动tableView,当cell1完全移出屏幕,并且 cell11(它也是alloc出来的,原因同上)完全显示出来的时候。 cell11加入到visiableCells,cell1移出 visiableCells,cell1加入到reusableTableCells。

3.接着向下拖动tableView,因为reusableTableCells中已 经有值,所以,当需要显示新的cell, cellForRowAtIndexPath再次被调用的时 候,tableView dequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。 cell1加入到visiableCells,cell1 移出reusableTableCells;cell2移出 visiableCells,cell2加入到

reusableTableCells。之后再需要显示的Cell就可 以正常重用了

3.UITableView的性能优化? 滑动的时候有种卡的感觉是为什么?怎么解决?

然而在使用第三方应用时,却经常遇到性能上的问题,普遍表现在滚动时比较卡,特别是table cell中包含图片的情况时。 实际上针对性地优化一下就可以解决tableView滑动的时候卡顿的问题, 在iOS应用中,UITableView应该是使用率最高的视图之一了。iPod、时钟、日历、备忘录、Mail、天气、照片、电话、短信、Safari、App Store、iTunes、Game Center⋯几乎所有自带的应用中都能看到它的身影,可见它的重要性。 然而在使用第三方应用时,却经常遇到性能上的问题,普遍表现在滚动时比较卡,特别是table cell中包含图片的情况时。

实际上只要针对性地优化一下: 1>同一时间其实只需要存在一屏幕的cell对象即可,不需要为每一行创建一个cell。

UITableView是UIScrollView的子类,因此它可以自动响应滚动事件(一般为上下滚动)。 它内部包含0到多个UITableViewCell对象,每个table cell展示各自的内容。当新cell需要被显示时,就会调用tableView:cellForRowAtIndexPath:方法来获取或创建一个 cell;而不可视时,它又会被释放。由此可见,同一时间其实只需要存在一屏幕的cell对象即可,不需要为每一行创建一个cell。 此 外,UITableView还可以分为多个sections,每个区段都可以有自己的head、foot和cells。而在定位一个cell时,就需要2 个字段了:在哪个section,以及在这个section的第几行。这在iOS SDK中是用NSIndexPath来表述的,UIKit为其添加了indexPathForRow:inSection:这个创建方法。 其他诸如编辑之类的就不提了,因为和本文无关。

介绍完原理,接下来就开始优化吧。

使用不透明视图。

不透明的视图可以极大地提高渲染的速度。因此如非必要,可以将table cell及其子视图的opaque属性设为YES(默认值)。 其中的特例包括背景色,它的alpha值应该为1(例如不要使用clearColor);图像的alpha值也应该为1,或者在画图时设为不透明。

不要重复创建不必要的table cell。

前面说了,UITableView只需要一屏幕的UITableViewCell对象即可。因此在cell不可见时,可以将其缓存起来,而在需要时继续使用它即可。 而UITableView也提供了这种机制,只需要简单地设置一个identifier即可:

static NSString *CellIdentifier = @\"xxx\"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } 值得一提的是,cell被重用时,它内部绘制的内容并不会被自动清除,因此你可能需要调用setNeedsDisplayInRect:或setNeedsDisplay方法。 此 外,在添加table cell的时候,如果不需要动画效果,最好不要使用insertRowsAtIndexPaths:withRowAnimation:方法,而是直接调 用reloadData方法。因为前者会对所有indexPaths调用tableView:cellForRowAtIndexPath:方法,即便该 cell并不需要显示(不知道是不是bug),这就可能创建大量多余的cell。勘误:只是在模拟器上测试如此,真机调试时没有这种bug。

减少视图的数目。

UITableViewCell包含了textLabel、detailTextLabel和imageView等view,而

你还可以自定义一些视图放在它的contentView里。然而view是很大的对象,创建它会消耗较多资源,并且也影响渲染的性能。 如果你的table cell包含图片,且数目较多,使用默认的UITableViewCell会非常影响性能。奇怪的是,使用自定义的view,而非预定义的view,明显会快些。 当然,最佳的解决办法还是继承UITableViewCell,并在其drawRect:中自行绘制:

- (void)drawRect:(CGRect)rect { if (image) { [image drawAtPoint:imagePoint]; self.image = nil; } else { [placeHolder drawAtPoint:imagePoint]; } [text drawInRect:textRect withFont:font lineBreakMode:UILineBreakModeTailTruncation]; } 不过这样一来,你会发现选中一行后,这个cell就变蓝了,其中的内容就被挡住了。最简单的方法就是将cell的selectionStyle属性设为UITableViewCellSelectionStyleNone,这样就不会被高亮了。 此外还可以创建CALayer,将内容绘制到layer上,然后对cell的contentView.layer调用addSublayer:方法。这个例 子中,layer并不会显著影响性能,但如果layer透明,或者有圆角、变形等效果,就会影响到绘制速度了。解决办法可参见后面的预渲染图像。

不要做多余的绘制工作。

在实现drawRect:的时候,它的rect参数就是需要绘制的区域,这个区域之外的不需要进行绘制。 例如上例中,就可以用CGRectIntersectsRect、CGRectIntersection或CGRectContainsRect判断是否需要绘制image和text,然后再调用绘制方法。

预渲染图像。

你会发现即使做到了上述几点,当新的图像出现时,仍然会有短暂的停顿现象。解决的办法就是在bitmap context里先将其画一遍,导出成UIImage对象,然后再绘制到

屏幕,详细做法可见《利用预渲染加速iOS设备的图像显示》。

不要阻塞主线程。

做到前几点后,你的table view滚动时应该足够流畅了,不过你仍可能让用户感到不爽。常见的现象就是在更新数据时,整个界面卡住不动,完全不响应用户请求。 出现这种现象的原因就是主线程执行了耗时很长的函数或方法,在其执行完毕前,无法绘制屏幕和响应用户请求。其中最常见的就是网络请求了,它通常都需要花费数秒的时间,而你不应该让用户等待那么久。 解决办法就是使用多线程,让子线程去执行这些函数或方法。这里面还有一个学问,当下载线程数超过2时,会显著影响主线程的性能。因此在使用 ASIHTTPRequest时,可以用一个NSOperationQueue

来维护下载请求,并将其

maxConcurrentOperationCount设为2。而NSURLRequest则可以配合GCD来实现,或者使用NSURLConnection的setDelegateQueue:方法。 当然,在不需要响应用户请求时,也可以增加下载线程数,以加快下载速度:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { if (!decelerate) { queue.maxConcurrentOperationCount = 5; } }(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { queue.maxConcurrentOperationCount = 2; } 此外,自动载入更新数据对用户来说也很友好,这减少了用户等待下载的时间。例如每次载入50条信息,那就可以在滚动到倒数第10条以内时,加载更多信息:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if (count - indexPath.row

成后,如果cell是可见的,还需要更新图像:

NSArray *indexPaths = [self.tableView indexPathsForVisibleRows];for (NSIndexPath *visibleIndexPath in indexPaths) { if (indexPath == visibleIndexPath) { MyTableViewCell *cell = (MyTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath]; cell.image = image; [cell setNeedsDisplayInRect:imageRect]; break; } }// 也可不遍历,直接与头尾相比较,看是否在中间即可。 最后还是前面所说过的insertRowsAtIndexPaths:withRowAnimation:方法,插入新行需要在主线程执行,而一次插入很多行的话(例如50行),会长时间阻塞主线程。而换成reloadData方法的话,瞬间就处理完了。l 4 tableview的cell里如何嵌套collection view?

思路同网易新闻类似, 用自定义的继承自UITableViewCell的类, 在initWithFrame的构造方法中, 初始化自定义的继承自UICollectionView的类

5 下拉和上拉的原理? 上拉和下拉的原理可以参照新浪微博的上拉和下拉刷新, 以tableView的上拉刷新为例:

1>为了进行无缝阅读, 通过tableView的代理方法, willDisplayCell判断是否是最后一行,

2>如果是最后一行, 在显示最后一行的同时, 判断当前是否存在上拉刷新 3>如果当前没有上拉刷新, 就进行加载数据, 启动”橘花”

以tableView的下拉刷新为例: 1>判断当前的上拉刷新视图是否动画

2>如果没有动画, 就不是上拉刷新 3>然后下拉刷新加载数据 4>加载完毕数据关闭刷新

推荐第10篇:程序员工作总结

在很多时候都会想为之前的工作做个总结,在今后的工作上能够取长把工作做得更好,有了工作总结,对下一年的计划也会比较得心应手。

2012年伊始是通过分销资源计划系统(DRp)拉开序幕.此次项目是一个相对比较完整的Java Web项目,从最基础的业务介绍,到需求分析,数据库分析与设计,页面设计,代码编写….直到整个项目的完成,通过这个项目学到了很多新的知识,同时对很多已经学过的知识进行很好的摩擦和补充.因为在其中还穿插着其他的内容,所以用了有半年左右的时间。

从4月初到5月末,准备并进行软件设计师的考试.这是我第二次参加软件设计师考试.通过两次考试的对比可以明显的发现产生在自己身上的一些改变和进步.具体可见无经历,不成熟—软件设计师考试后总结

但是最终的考试结果是没有通过,和第一次一样,差两分.虽然成绩的结果没有通过,但是通过这次软件设计师的复习考试,很给力的给自己补充了计算机基础方面的知识,同时也解了自己很多的疑惑,真正的学到了很多的知识.回顾自己整个的复习过程,收获是很大的,不仅仅是计算机基础,更是一种面对失败的心态收获.而这种心态将会在自己未来的路上会起很大的作用.

后半年进入SSH项目的实践和学习.

SSH为struts+spring+hibernate的一个集成框架,是目前较流行的一种轻量级Web应用程序开源框架。

Struts就是一个MVC的架构,在控制器,视图和模型方面都有其特定的组件,在SSH框架中,更多的是利用了Controller这个组件。

Spring实现了反转控制(Inversion ofControl)和面向方面编程(Achievement-Orientedprogramming)。Spring框架的能实现应用的分层架构,在应用中要使用的对象可以被一个简单的XML文件连在一起,这个XML文件含有到像事务管理器、对象工厂、包含业务逻辑的服务对象、和数据存取对象这些对象的引用。

Hibernate是一种ORM映射工具,它不仅提供了从Java类到数据表之间的映射,也提供了数据查询和恢复机制。相对于使用JDBC和SQL来手工操作数据库,使用Hibernate,可以大大减少操作数据库的工作量。

通过对SSH框架的学习,认识到框架给我们开发所带来的便利,更重要的是在框架形成的过程中所包含的原理和思想.收获都在一篇篇的博客中.

大概在十月和十一月的时候准备第三次软件设计师考试.吸取教训,总结经验,摆正心态,认真跟八期一起讨论和学习,这一次不仅仅是自己学习和通过考试,同时跟颖杰一起组织并带领八期一同复习和学习,这本身也是个锻炼和学习.当时也对自己考完后进行了一个总结:详见软考总结.

以上是自己计算机方面的主线.相对于计算机这条线而言,另外一个贯穿始终的是英语学习ShortBrain这条线.

算算从开始进行ShortBrain到现在已经有两年左右的时间了.而今年将会是一个关键的年份,关键是从听到说的突破,从沉默期中开始爆发.今年这一年也是英语中探索和收获比较大的一年,发现了更多符合ShortBrain思想的资料,收集各种资料,数据和文档.

因为是在探索着前进,中间也走了不少的弯路,其中一个什么时候开始说就在今年进行了三次以上的探索,在一次次的探索中积累了经验,通过对比自己一次次开口说的录音,发现的确是随风潜入夜,润物细无声.对于两年前的我,我的英语听力和口语能力有了很大的提高.这种提高通过看自己以前的记录会发现非常的明显.这种提高也是在正确的理念下的积累中所收获的.

英语习得的核心是像小孩一样去习得英语,是通过小孩的学习的过程逐渐的建立去英语思维,在原有的母语思维的基础之上建立第二思维.而在学习的过程中最切记的是急功近利,这是很多人进行ShortBrain时候所出现很多问题的根源.环境在整个学习的过程中也显的尤为重要.如何培养英语环境是我接下来的主要任务之一.相信在接下来的一年定会有所突破.

xiexiebang.com范文网(FANWEN.CHAZIDIAN.COM)

第11篇:程序员工作总结

程序员工作总结

把今天要做的事情认真用心做好,这是我一直以来尤其是近期的深刻感受。每天我都看文档,学东西,看的越多发现自己学的和掌握的实在是太少。自己在最近编程中,编程语言的进一步学习,编程思想的更深认识,代码的多层次分析,以上这些,实用高效地推进了项目进度。

在工作中学习成长,提高的不仅仅是代码质量,程序的功能实现也有了较为明显的进展,更重要的是,信心的提升。阶段性总结,记录出现的问题,反复调试,用心验证,找到解决bug的方法,完善程序的功能性。

都说做程序员的要记住一条经验,那就是:“学历代表过去、能力代表现在、学习代表未来。”我个人觉得学历并不代表全部,我们每天都可以学到新的知识,知识是可以一点点积累的,只要肯努力,一切皆有可能,我一直在努力,并且不断寻找方法。

当然,劳逸结合的工作才是高效的,相信自己会安排好每日的工作。公司的周例会我觉得非常有必要,大家一起梳理思路,为之前的工作总结,为下一阶段的任务进行安排,在正确的轨道上,个人才能为团队的发展进步做贡献。

对于延展性的知识学习和拓展,将是我接下来的主要

目标,加快完成项目的既定功能模块,加强编程技能性知识的学习,同时和同事、朋友就自己的心得体会交流,取长补短。

XXX

2013年1月25日

第12篇:程序员工作总结

2013工作总结

从我4月25日进入公司到现在已经过去八个月了,从一名刚刚结束实习的学生到一名独立的开发人员,角色改变了,职责也改变了。虽然已经预计了工作之中会有很多困难,可是在实际的项目开发中,自己所遇到远远不止自己想象之中的那么简单、单纯。在开发过程中,难题一个接一个的出现,要做到满足公司的产品需求,成为一名合格的程序开发人员,这个过程还很漫长。每天我都在勉励自己,要好好学,好好做,以后会好的。在此同时我衷心感谢公司给我提供了学习的机会和平台,这也使我对以后的日子多了些许的信心。

工作回顾

在我进入公司的这八个月里,我陆续接触了公司的GPS平台,智能手表定位,上海铁路局车站消防综合管理系统,盛泉金融款箱管理系统,中行保卫处的管理系统,指挥中心的视频监控系统,并在这期间为安徽品至制作了一个展示型企业网站。在刚进入公司的那段时间里,我从没有接触过网络摄像机,对于网络摄像机根本没有任何概念,在公司的培养下我逐渐熟悉了各种摄像机,现在拿到海康、英码、赛赫、中威的摄像机开发包,可以很熟练的进行二次开发。在工作之余,我也在努力的学习,和别人交流,学习先进的开发技术,请教别人开发技术问题。

主要问题

1.由于开始对业务需求不是很熟悉,所以在写需求分析与了解所要开发的过程中多次出现因为需求的原因,而不断修改、返工的情况。在同盛泉金融交流的时候,这个问题多次困扰着我,对方的需求不明,每次交流的过程中都在变更需求,从而导致了效率比较低的问题。

2.在开发中,用到很多我所不知道或很多我知道但不太熟悉的领域,在这个领域内,我需要不断的学习。

3.在工作阶段,有时比较偏向自己的工作方便,忽略了其他同事的工作上的量与难易。有的功能自己怎么方便怎么写,如今公司在不断壮大,我们部门人员在不断的增加,这样是不利于多人合作的。

4.工作的条理性不够清晰,要分清主次和轻重缓急;在开发时间很仓促的情况下,事情多了,就一定要有详实而主次分明的计划,哪些需要立即完成,哪些可以缓缓加班完成,在这方面还有很大的优化空间。

5.学习的知识不够广泛;一个项目中,涉及的技术往往有多种,知识多了,就会灵活变通,以后我会加强这方面的学习。

工作心得

1.每一个项目在开始着手的第一步,一定要和客户把需求沟通清楚,只有了解了项目的需求,才有可能真正做好一个项目。我们需要向客户提出要求客户提供所有涉及该项目的资料,每次与客户见面都需要熟悉业务与程序的最少一至两个程序员随时记录需求。

2.工作中,有一个无论是技术,还是经验都比较让人肯定的前辈带领,将任务详细化,详细到,每个页面、甚至是一个页面中的图片什么时候做好,做到什么程度,这样把工作进度有计划有方向的赞定下来,做事很有效率。和孙姐,王竹青,尤坤等人合作时候一定注意要多项工作同步进行,保证每个子模块都能同步运行。

3.每天的工作小结真的很重要,这让我们每天都有计划的知道自己干了什么,不是漫无目的的工作,所以我们应该养成,日记、周记、月记、年记的工作习惯。

4.工作并不是一成不变的,也许有一天你要去其他岗位帮忙,所以同事之间的技术要互相学习,也许有一天,公司需要你发挥其他的技能帮忙,所以互相学习也是很重要的。自己的工作不能仅仅局限于编程。

工作计划

1.要提高工作的主动性,做事干脆果断,不拖泥带水。2.工作要注重实效、注重结果,一切工作围绕着目标的完成。 3.要提高大局观,是否能让其他人的工作更顺畅作为衡量工作的标尺。

4.精细化工作方式的思考和实践。

5.虚心请教比我做的优秀的其他同事,向他们学习技术或经验。其实作为一个新员工,所有的地方都是需要学习的,多听、多看、多想、多做、多沟通,向每一个员工学习他们身上的优秀工作习惯,丰富的专业技能,配合着实际工作不断的进步,

不论在什么环境下,我都相信这两点:一是三人行必有我师,二是天道酬勤。

在参加工作的这短短的一个半月中,我深刻的体会到,把自己所有的精力都投入进去,技术工作都不可能做到完美程度,毕竟技术工作太繁杂,项目多而人手少,但多付出一些,工作就会优化一些,这就需要认认真真沉下心去做事情,职业做事,诚信待人。

2014年1月2号

第13篇:程序员工作总结

个人工作总结

从我11月份离校来到溪谷晨歌网络公司已将近一个半月了,从一个学生变成了一个员工,角色变了,职责也就变了。虽然工作上的很多困难都是在自己的预料之内,可是很多事情都不像在学校里那么简单、单纯。在项目开发的工作中,难题一个接一个的出现,自信心不止一次的受到过打击,虽然自己早就知道,要做到符合公司的要求,做一名合格的程序员,在学校学的知识,根本就不够,而且很不够。每天醒来我都不断勉励自己,好好学,以后会好的。在此同时,公司也给了我很多学习的机会,这使我对以后的编程之路又有了些许信心。

一、工作总结

11月下旬与12上旬的几天,我的主要任务是将公司的静态网站与数据库连接做成动态的。由于功能比较简单,做起来没有遇到什么困难。可是之后的“南京市砖瓦粘土信息管理”项目,里面涉及到的一个地图功能的实现,让我不知所措,不知道怎么实现。由于自己没有能力完成项目,项目就交给了其他公司,之后的工作都是在合作公司——南京宁派网络科技有限公司里学习、工作的,了解他们公司的开发项目流程,学习他们的开发技术,请教他们开发技术上的问题。

二、在工作中主要存在的问题有:

1、由于开始对业务需求不是很熟悉,所以在写需求分析与了解所要开发的过程中多次出现因为需求的原因,而不断修改、返工的情况。

2、在开发中,用到很多我所不知道或很多我知道但不太熟悉的技术,有时甚至会出现这种情况,合作公司的技术人员,讲个名词,我都要百度一下具体什么意思,涉及什么技术。

3、在工作阶段,有时比较偏向自己的工作方便,忽略了其他同事的工作上的量与难易。有的功能自己怎么方便怎么写,有点难为其他同事,大家都要相互配合。

三、工作心得

1、在这将近一个半月的工作实践中,我参与的都是团队合作的项目,无论是在自己公司,还是在合作公司,我们都讲究团队精神。在信任自己和他人的基础上,思想统一,行动一致,这样的团队一定会攻无不克、战无不胜。我们的很多工作是一起完成的,在这个过程中,大家互相提醒和补充,大大提高了工作效率,所有的工作中沟通是最重要的,一定要把信息处理的及时、有效和清晰。

2、每一个项目在开始着手的第一步,一定要和客户把需求沟通清楚,只有了解了项目的需求,才有可能真正做好一个项目。我们需要向客户提出要求客户提供所有涉及该项目的资料,每次与客户见面都需要熟悉业务与程序的最少一至两个程序员随时记录需求。

3、工作中,有一个无论是技术,还是经验都比较让人肯定的前辈带领,将任务详细化,详细到,每个页面、甚至是一个页面中的图片什么时候做好,做到什么程度,这样把工作进度有计划有方向的赞定下来,做事很有效率。

4、每天的工作小结真的很重要,这让我们每天都有计划的知道自己干了什么,不是漫无目的的工作,所以我们应该养成,日记、周记、月记、年记的工作习惯。

5、工作并不是一成不变的,也许有一天你要去其他岗位帮忙,所以同事之间的技术要互相学习,也许有一天,公司需要你发挥其他的技能帮忙,所以互相学习也是很重要的,我在宁派公司,深有感触,除编程之外,切图、界面设计等工作都干过。

四、工作教训

经过一个半月的工作学习,我也发现了自己离一个符合公司要求的程序员还有很多差距,主要体现在工作技能与工作经验的不够,也是我以后要在工作中不断磨练和提高自己的地方。仔细总结一下,自己在一个半月工作中主要有以下方面做得不够好:

1.工作的条理性不够清晰,要分清主次和轻重缓急;

在开发时间很仓促的情况下,事情多了,就一定要有详实而主次分明的计划,哪些需要立即完成,哪些可以缓缓加班完成,在这方面还有很大的优化空间。

2.对流程、业务需求不够熟悉;

在工作中,发现因为流程或业务需求的问题而不知道如何下手的情况有点多,包括错误与缺漏还有当时设计考虑不到位的地方,对于这块的控制力度显然不够。平时总是在开发,但说到底对业务很熟悉才是项目很好完成的前提

3.缺乏工作经验;

4.学习的知识不够广泛;

一个项目中,涉及的技术往往有多种,知识多了,就会灵活变通,以后我会加强这方面的学习。

五、工作计划

暂时做出以下几点规划:

1、要提高工作的主动性,做事干脆果断,不拖泥带水;

2、工作要注重实效、注重结果,一切工作围绕着目标的完成;

3、要提高大局观,是否能让其他人的工作更顺畅作为衡量工作的标尺;

4、把握一切机会提高专业能力,加强平时知识总结工作;

5、精细化工作方式的思考和实践。

6、虚心请教比我做的优秀的其他同事,向他们学习技术或经验。

其实作为一个新员工,所有的地方都是需要学习的,多听、多看、多想、多做、多沟通,向每一个员工学习他们身上的优秀工作习惯,丰富的专业技能,配合着实际工作不断的进步,不论在什么环境下,我都相信这两点:一是三人行必有我师,二是天道酬勤。

在参加工作的这短短的一个半月中,我深刻的体会到,把自己所有的精力都投入进去,技术工作都不可能做到完美程度,毕竟技术工作太繁杂,项目多而人手少,但多付出一些,工作就会优化一些,这就需要认认真真沉下心去做事情,就是公司所提倡的企业精神:职业做事,诚信待人。

程序员:***

2012年1月3日星期二

第14篇:程序员工作总结

作为程序员,工作的这一年时间有怎样的任务需要做好总结的呢?如下是小编给大家整理的程序员工作总结,希望对大家有所作用。程序员工作总结篇【一】

记得去年写总结的时候心情很差,抱怨了很多当时的工作以及领导花生,那个时候的愿望是找一份新工作。没想到刚进入12月我就找到了。

不得不说这一次求职我是认真的把它当作一个工程去做,客观得对自己进行了定位,而且非常重要的是明确我想要的工作到底是什么样的。我需要的是让我每天的8小时能够享受工作的快乐。

投简历面试的过程非常折磨人,尤其是我的处境(每天很大压力,完全是自我打磨的阶段)。我清楚地记得面试现在这份工作那天是某个周六,我的经理娃娃和技术主管T同意我周末面试。一共4个小时,那绝对是一个互相争取的过程。他们对于工作的热情打动了我,觉得和这样的团队合作一定可以有火花。

真是幸运,当我正视错误,用行动做出改变的时候,找到了一份我要的工作。入职三周已经和团队磨合得很好了,用同事的话说就是觉得我已经加入很久了。

这里不得不说一句我们的团队,一个老中青结合富有战斗力的集体,而且还不乏八卦调节生活。每个人都特别,合作也会有摩擦,但是整体运作非常协调,开发速度和效率都高。从他们身上我看到不同的工作态度,生活态度。这些对我的职业规划都有着潜移默化的影响。领导“娃娃”也非常合适我目前阶段对于领导的需求。如果说几年前我初出茅庐需要的是一个有时间且肯耐心带我的领导的话,现在的我需要的是一个可以给予我充分信任的上司。“娃娃”信任我,从刚进入公司就如此。在熟悉产品阶段我提出的问题和建议他都认真的听了,而且给我时间让我按照自己的想法作出修改。后来我也喜欢把新想法跟他说,当我们带着创意去和老板谈的时候他是我坚强的后盾。

这一年下来我在纯技术上的提高并不多,我们所面向的客户并不要求尖端的技术。经验主要体现在理解需求上面,如果说前两年我还需要领导把需求说得很明白,还会为马后炮而耿耿于怀。那么今年应该算是个分水岭。现在的我不需要领导花很久时间来讲需求,也不用每一步都需要认可再做接下来的工作。总的来说就是技术和业务之间的距离越来越近,而且还可以想到客户将来会需要什么,我曾经的领导应该很欣慰,他培养的人终于达到他说的bigpicture了。

程序员工作总结篇【二】

从我11月份离校来到溪谷晨歌网络公司已将近一个半月了,从一个学生变成了一个员工,角色变了,职责也就变了。虽然工作上的很多困难都是在自己的预料之内,可是很多事情都不像在学校里那么简单、单纯。在项目开发的工作中,难题一个接一个的出现,自信心不止一次的受到过打击,虽然自己早就知道,要做到符合公司的要求,做一名合格的程序员,在学校学的知识,根本就不够,而且很不够。每天醒来我都不断勉励自己,好好学,以后会好的。在此同时,公司也给了我很多学习的机会,这使我对以后的编程之路又有了些许信心。

一、工作总结

11月下旬与12上旬的几天,我的主要任务是将公司的静态网站与数据库连接做成动态的。由于功能比较简单,做起来没有遇到什么困难。可是之后的“南京市砖瓦粘土信息管理”项目,里面涉及到的一个地图功能的实现,让我不知所措,不知道怎么实现。由于自己没有能力完成项目,项目就交给了其他公司,之后的工作都是在合作公司南京宁派网络科技有限公司里学习、工作的,了解他们公司的开发项目流程,学习他们的开发技术,请教他们开发技术上的问题。

二、在工作中主要存在的问题有:

1、由于开始对业务需求不是很熟悉,所以在写需求分析与了解所要开发的过程中多次出现因为需求的原因,而不断修改、返工的情况。

2、在开发中,用到很多我所不知道或很多我知道但不太熟悉的技术,有时甚至会出现这种情况,合作公司的技术人员,讲个名词,我都要百度一下具体什么意思,涉及什么技术。3、在工作阶段,有时比较偏向自己的工作方便,忽略了其他同事的工作上的量与难易。有的功能自己怎么方便怎么写,有点难为其他同事,大家都要相互配合。

三、工作心得

1、在这将近一个半月的工作实践中,我参与的都是团队合作的项目,无论是在自己公司,还是在合作公司,我们都讲究团队精神。在信任自己和他人的基础上,思想统一,行动一致,这样的团队一定会攻无不克、战无不胜。我们的很多工作是一起完成的,在这个过程中,大家互相提醒和补充,大大提高了工作效率,所有的工作中沟通是最重要的,一定要把信息处理的及时、有效和清晰。

2、每一个项目在开始着手的第一步,一定要和客户把需求沟通清楚,只有了解了项目的需求,才有可能真正做好一个项目。我们需要向客户提出要求客户提供所有涉及该项目的资料,每次与客户见面都需要熟悉业务与程序的最少一至两个程序员随时记录需求。

3、工作中,有一个无论是技术,还是经验都比较让人肯定的前辈带领,将任务详细化,详细到,每个页面、甚至是一个页面中的图片什么时候做好,做到什么程度,这样把工作进度有计划有方向的赞定下来,做事很有效率。

4、每天的工作小结真的很重要,这让我们每天都有计划的知道自己干了什么,不是漫无目的的工作,所以我们应该养成,日记、周记、月记、年记的工作习惯。

5、工作并不是一成不变的,也许有一天你要去其他岗位帮忙,所以同事之间的技术要互相学习,也许有一天,公司需要你发挥其他的技能帮忙,所以互相学习也是很重要的,我在宁派公司,深有感触,除编程之外,切图、界面设计等工作都干过。

四、工作教训

经过一个半月的工作学习,我也发现了自己离一个符合公司要求的程序员还有很多差距,主要体现在工作技能与工作经验的不够,也是我以后要在工作中不断磨练和提高自己的地方。仔细总结一下,自己在一个半月工作中主要有以下方面做得不够好:

1、工作的条理性不够清晰,要分清主次和轻重缓急;在开发时间很仓促的情况下,事情多了,就一定要有详实而主次分明的计划,哪些需要立即完成,哪些可以缓缓加班完成,在这方面还有很大的优化空间。

2、对流程、业务需求不够熟悉;在工作中,发现因为流程或业务需求的问题而不知道如何下手的情况有点多,包括错误与缺漏还有当时设计考虑不到位的地方,对于这块的控制力度显然不够。平时总是在开发,但说到底对业务很熟悉才是项目很好完成的前提。

3、缺乏工作经验。

4、学习的知识不够广泛。一个项目中,涉及的技术往往有多种,知识多了,就会灵活变通,以后我会加强这方面的学习。

五、工作计划

暂时做出以下几点规划:

1、要提高工作的主动性,做事干脆果断,不拖泥带水;

2、工作要注重实效、注重结果,一切工作围绕着目标的完成;

3、要提高大局观,是否能让其他人的工作更顺畅作为衡量工作的标尺;

4、把握一切机会提高专业能力,加强平时知识总结工作;

5、精细化工作方式的思考和实践。

6、虚心请教比我做的优秀的其他同事,向他们学习技术或经验。其实作为一个新员工,所有的地方都是需要学习的,多听、多看、多想、多做、多沟通,向每一个员工学习他们身上的优秀工作习惯,丰富的专业技能,配合着实际工作不断的进步,不论在什么环境下,我都相信这两点:一是三人行必有我师,二是天道酬勤。

在参加工作的这短短的一个半月中,我深刻的体会到,把自己所有的精力都投入进去,技术工作都不可能做到完美程度,毕竟技术工作太繁杂,项目多而人手少,但多付出一些,工作就会优化一些,这就需要认认真真沉下心去做事情,就是公司所提倡的企业精神:职业做事,诚信待人。

第15篇:程序员工作总结

个人工作总结

从我11月份离校来到公司已将近一个月了,我所从事的工作是程序员,下面是对我工作内容的一些介绍。

一、工作内容:

工作刚开始的几天,我的主要任务是将公司的静态网站与数据库连接做成动态的。由于功能比较简单,做起来没有遇到什么困难。可是之后的项目,里面涉及到的一个地图功能的实现,让我不知所措,不知道怎么实现。由于自己没有能力完成项目,项目就交给了其他同事,之后的工作都是在公司里跟着同事一起学习,了解工作的内容和工作流程

二、工作中学习到的知识和技能:

1、在这将近一个月的工作实践中,我参与的都是团队合作的项目,无论是在自己工作,还是和同事一起配合,我们都讲究团队精神。在信任自己和他人的基础上,思想统一,行动一致,这样的团队一定会攻无不克、战无不胜。我们的很多工作是一起完成的,在这个过程中,大家互相提醒和补充,大大提高了工作效率,所有的工作中沟通是最重要的,一定要把信息处理的及时、有效和清晰。

2、每一个项目在开始着手的第一步,一定要和客户把需求沟通清楚,只有了解了项目的需求,才有可能真正做好一个项目。我们需要向客户提出要求客户提供所有涉及该项目的资料,每次与客户见面都需要熟悉业务与程序的最少一至两个程序员随时记录需求。

3、工作中,有一个无论是技术,还是经验都比较让人肯定的前辈带领,将任务详细化,详细到,每个页面、甚至是一个页面中的图片什么时候做好,做到什么程度,这样把工作进度有计划有方向的赞定下来,做事很有效率。

4、工作并不是一成不变的,也许有一天你要去其他岗位帮忙,所以同事之间的技术要互相学习,也许有一天,公司需要你发挥其他的技能帮忙,所以互相学习也是很重要的,我在宁派公司,深有感触,除编程之外,切图、界面设计等工作都干过。

三、工作时间:

1、公司实行五天/周工作制,每天工作时间不得超过8小时

2、我们公司一般的上班时间安排为:

上午8:30---11:30

下午13:00--17:30 在参加工作的这短短的一个月中,我深刻的体会到,把自己所有的精力都投入进去,技术工作都不可能做到完美程度,毕竟技术工作太繁杂,项目多而人手少,但多付出一些,工作就会优化一些,这就需要认认真真沉下心去做事情,就是公司所提倡的企业精神:职业做事,诚信待人。

蔡淑敏

2013年11月24日星期日

其实作为一个新员工,所有的地方都是需要学习的,多听、多看、多想、多做、多沟通,向每一个员工学习他们身上的优秀工作习惯,丰富的专业技能,配合着实际工作不断的进步 后工作中,要努力做好开发人员的本职工作,把自己的工作创造性做好做扎实,为 项目的开发以及公司的发展贡献自己的力量

一种积极豁达的心态、一种良好的习惯、一份计划并按时完成竟是如此重要,并最终决定一个的人成败

这一段时间的工作也让我明白了一点:一个优秀的程序员必须不断的学习,随时总结,找到自己的不足,这样逐步提高,才能让自己很快的成长起来。

做程序员的要记住第一条经验:“学历代表过去、能力代表现在、学习代表未来。”我个人觉得学历并不代表全部,我们每天都可以学到新的知识,知识是可以一点点积累的,只要肯努力,一切皆有可能 .

第16篇:ios毕业论文

河南理工大学毕业设计(论文)说明书

摘 要

随着计算机网络通信技术和Internet的飞速发展,基于因特网的手机移动应用已经开始成为一种全新的功能需求,并且越来越受到人们的关注。由于移动应用具有简单性,随时随地性等诸多特点,因此它有着传统计算机所无法比拟的优点。这样一来,手机移动应用的开发工作就显得尤为重要,开发出一个集合手机应用的“商店”极为重要,近年来iphone手机在中的发展趋势日趋上升,iphone手机保密性很强,很多东西都不对外开放,爱限免手机app就是针对iphone手机而开发的一款手机应用,日趋扩大的市场也使得应用于iphone手机的app开发日趋紧迫,可以说爱限免的开发不仅是客户的需求更是市场的需求。

爱限免项目的开发使用了iphone自己研发的开发软件xcode6.0,主要有UIkit框架和Foundation框架组成。爱限免的项目开发,对数据进行展示主要应用列表控制器UIableview,在使用UItableview是对cell的复用是此技术的难点,主要避免在cell复用是出现内存泄露状况而导致的程序崩溃,数据的获取应用了AFHttpNetWork第三方库,对网络数据进行get获取,把获取的数据用数据模型接收,这样有利于降低耦合性,是程序更顺畅。在对数据保存时用到了FMDB第三方数据库,此数据库的底层也是对squlite的封装,是开发者应用起来更顺手简介,提高效率,界面之间的数据传输难点blcok的应用,这点要求开发者对block有比较深刻的理解,以及应用熟练度。 关键词:ios,squlite,block,应用,控件

I

河南理工大学毕业设计(论文)说明书

Abstract

With the rapid development of computer network communication technology and the Internet, based on Internet mobile phone application has begun to become a kind of new functional requirements, and people have paid more and more attention.Because of its simplicity, anytime, anywhere, etc., it has the advantages that the traditional computer can\'t match..In this way, the mobile application development work is particularly important, the development of a collection of mobile application store \"is very important, in recent years the iPhone in the development trend is rising day by day, iPhone mobile phone security is very strong, a lot of things are not open to the public, love limit free mobile app is for the iPhone and the development of a mobile application, widening the market also make the application to iPhone app development is becoming more and more urgent, you can love limit free development is not only the needs of customers is the demand of the market

The development of love limited free project use of iPhone own R & D software xcode6.0, mainly UIkit framework and Foundation framework.Love free for a limited time of project development, the data for display of the main application list controller UIableview, in the use of UItableview is reuse of the cell is the difficulty of this technology, mainly to avoid memory leak condition, which leads to the program crashes in the cell multiplexing and data acquisition application the AFHttpNetWork third-party libraries, the network data to get acce to, to get the data model data receiving, which help to reduce coupling is proce smoother.In to save the data used in the FMDB database of the third party, the bottom of this database is to squlite package is more comfortable profile application developers, improve efficiency, application of interface between data transmiion difficulties blcok, this requires developers to more profound understanding of block, as well as the application of proficiency Keywords: IOS, squlite, block, application, control II

河南理工大学毕业设计(论文)说明书

目 录

摘 要 ............................................................I 第一章 前 言 .....................................................1

1.1 课题开发背景 ................................................1 1.2 爱限免手机app框架设计开发的现实意义 ........................2 1.3 国内外研究状况 ..............................................2 1.4 论文内容和结构 ..............................................3 第2章 爱限免手机应用开发技术简介 .................................5

2.1 Objective-c简介.............................................5 2.1.1 ios系统框架 ...........................................6 2.1.2核心操作系统层和核心服务层 .............................7 2.1.3应用程序框架 ...........................................8 2.2 SQLite数据库介绍............................................9 2.3 XCode ......................................................10 第3章 爱限免手机应用app需求分析 ................................11

3.1 爱限免手机应用app的可行性分析 .............................11 3.2 爱限免手机应用app功能需求分析 .............................13 3.2.1 功能需求..............................................14 第4章 爱限免手机应用app设计 ....................................16

4.1 模块功能设计 ...............................................16 4.1.1 限免模块..............................................16 4.2.1 免费模块..............................................21 4.2.2 专题模块..............................................26 4.2.3 分享功能模块..........................................30 4.2.4 收藏功能模块..........................................32 4.2.5 搜索功能模块..........................................36 第5章 系统测试 ..................................................38

5.1 功能模块测试 ...............................................38 5.2 功能整体测试 ...............................................39 总结与展望 .......................................................40

总结 ...........................................................40

III

河南理工大学毕业设计(论文)说明书

展望 ...........................................................41 参考文献 .........................................................43 谢 辞 ...........................................................44

IV

河南理工大学毕业设计(论文)说明书

第一章 前 言

1.1 课题开发背景

如今移动开发产业让人眼花缭乱,主要的开饭平台有:iOS(iPhoneOS)、Android、Nokia Symbian、BlackBerry、Java ME、Windows Phone、Flash/Flash Lite、mobile web(WAP/XHTML/CSS/Javascript)。Android以其开放性,多任务,大功能,画面流畅,硬件设备优良多样等各种优点,占智能机一大部分;然而它也存在着很明显的不足,如:兼容性差,各种机型的配置不一样,以至于开发的时候出现各种版本。有些产品华而不实,用户体验差。Symbian主要基于C语言的应用开发,支持多线程运行模式,但是开发代码量过大给开发人员造成很大的不便,另外塞班版本之间兼容性差也是SymbianOS需要改进的一个地方。就目前而言,三大平台(Android、Symbian、BlackBerry)的市场占有率也在逐渐下降,iOS呈现平稳上升趋势。

1.App Store的支付模式成熟

App Store的成熟不仅仅是商业模式的创新,更重要的是无法模仿,经过长时间的运营,App Store已经形成完备的支付模式,被大部分用户接受。

2.iOS是用Objective-C开发

从全球的编程语言排行榜来看,虽然,Objective-C只有苹果公司一家使用,但是已经排名第4,可见iOS开发的普及性和受欢迎程度,另外,objective-c是对c语言的封装,既没有了c语言写程序的繁琐复杂性,又兼顾了c语言的高效率,这也使得objective-c语言在编程语言中的地位以及受欢迎度日益上升的一个因素。

3.Iphone性能优越

苹果iPhone以及所有苹果的硬件软件策略和控制让苹果在用户体验和控制产品质量方面占尽先机,大部分iOS用户能够同时对他们手中的设备进行更新,这会吸引更多用户。

4.iPhone在中国极受欢迎

中国的各大移动运营商都积极地与苹果公司合作,各自推出适合中国人使用的手机套餐和应用,比如中国联通,中国电信等等,社会各界也对iPhone有很好的评价,还有很多知名手机应用软件,如qq微信等也加入了app store。

5.iOS在各国开发者中有很好的学习氛围

如facebook的three 20 iOS开源代码库,都是良好的学习资源,还有一些

河南理工大学毕业设计(论文)说明书

前辈大牛发表的博客如博客园就是一个ios开发者很好的交流网站,还有一些如cocoachina里边集合了很多开发者的心得及项目,国内外的开发大牛都有在上边发表自己的心得。也是ios开发者良好的学习资源。

1.2 爱限免手机app框架设计开发的现实意义

随着科技的发展技术的进步,手机的功能也出现了翻天覆地的变化,由原来只是打电话发短信的基本功能,转变为现在的全功能智能手机,人们对手机的要求也越来越高。

1.iphone手机中国市场无限扩大

Iphone手机的性能优越已经不言而喻,不用就释放也使得iphone手机避免了安卓手机卡机现象,然而iphone手机并不对外开源,是的其核心技术只被苹果公司垄断,关于iphone手机的手机应用也是少之又少,毕竟开发者有限。因此iphone手机的app开发也是迫切的。

2.开发框架完善

Iphone应用的开发主要平台式有iphone公司自己研发的开发平台xcode,是由苹果公司的先辈大牛写出来的,主要用于ios开发者开发软件,集合objective-c,性能比较完善。

3.满足市场

Iphone主要软件获取是从appStore中买或者是免费下载,爱限免主要实现对iphone手机应用的时时推荐,把app进行条理分类,便于用户根据个人需求获取自己想要得到的app。

1.3 国内外研究状况

1.国外

第一代iPhone在2007年诞生虽然现在也许很难想象,但是当第一代iPhone发布的时候,它相对来说落后的特性和功能是不足以让它直接在纸面的参数对比上胜过竞争对手的。当时的Windows Mobile, Palm OS, Symbian, 甚至是BlackBerry都是2007年间相对成熟的系统了,都拥有广泛而又深厚的特性积累。相比之下,iPhone不支持3G网络,不支持多任务操作,也不支持第三方应用。你没有办法去复制/粘贴文本,你没有办法在想要发送的电子邮件中添加附件。就连彩信iPhone也没有办法提供支持。其他方面的特性缺失还包括:Exchange邮件推送、可自定义的主屏幕、tethering、可见的全局文件管理器、Office文件编辑、语音拨号、以及对黑客和开发者所理应由的开放性,iphone发布三个 2

河南理工大学毕业设计(论文)说明书

月之后就迎来了第一次升级,引入了iTunes Wi-Fi MusicStore。它允许用户直接在iPhone上面购买音乐,它或许是许许多多iPhone新特性中因为运营商网络压力或者运营利益而遭到压制的例子中的第一个,在随之而来的ios2解决了手机应用问题加入了appstore,App Store同时存在于手机(AppStore应用)和PC(iTunes)两个地方,用户选择任意一种途径都可以自由地浏览和安装应用程序。这对于过去分散性极高的移动应用(大部分通过web直接下载,有些应用存在于第三方应用商店,整体和OS的整合度较差)来说是一个巨大的变化。另外重要的是,AppStore和iTunesMusic使用一个账号,用户无需再次输入自己的信用卡账号密码。这意味着查找和安装应用程序将前所未有的容易,这大大提高了用户冲动消费的可能性,在之后的升级中也加入了自己原创的地图的一些高级功能。 2.国内

随着智能手机的大众化,越来越多的人应用智能手机。相对的对手机软件的需求也就越来越多。当今时代手机不再只是用来打电话、发短信的工具,反而对手机的娱乐功能要求越来越高。手机新闻也成为了人们的主要获取信息途径之一。目前中国新闻行业已经具备了相当的规模,并在国际市场上已有一定的竞争力。苹果手机作为当今中国智能手机市场上不可或缺的一个品牌,基于iOS的手机软件需求量也就相应的越来越强。市场上的新闻品牌繁多,定位不一,基本满足了各层次消费者的需求,例如:腾讯新闻、搜狐新闻、网易新闻、新浪新闻等等这些大家所熟知的新闻已经在苹果软件中占据了一定的地位。智能手机的普及使得移动信息平台成为了主流。伴随着苹果手机进入中国市场,相应的iOS技术逐渐流行起来。而对于开发苹果应用的语言Objective-C,也成为当今社会最流行的开发语言,并且保持着强劲的上升趋势,隐隐有超过C语言的现象。对于其他的开发语言,例如java、javascripe,Object-C以其强大的优势遥遥领先于这些其他的编程语言。本人根据当前的形式,决定引用这种这种技术来开发手机应用。

1.4 论文内容和结构

本论文主要写的是一个ios项目-爱限免的实现过程,以及一些在实现过程中遇到的难题,解决方法,自己在解决问题中的体悟和感受,以及对以后项目的完善的展望,本文把实现项目过程中的核心代码张是给读者看,让读者对我的项目有初步的了解,也对关键代码附有文字说明以及代码运行后的图片展示。具体 3

河南理工大学毕业设计(论文)说明书

章节内容如下简介讲述:

第一章,介绍了课题的开发背景、课题开发的现实意义、国内外研究综述、论文内容及结构。

第二章,概略地介绍了开发爱限免手机应用多用到的各种技术,比如新技术Objective-c,SQLite数据库,开源框架的json解析等。

第三章,对爱限免系统结构设计、系统结构功能、运行环境等概要分析设计阶段做工了大体介绍即需求分析。

第四章,对系统总体流程设计、系统整体框架、后台逻辑处理功能设计和数据库设计作了简要说明具体介绍了系统各功能实现过程,如分享、收藏等。

第五章,大体介绍了对本系统的测试工作,涵盖了测试计划、测试结果以及测试分析这三个方面的内容。

河南理工大学毕业设计(论文)说明书

第2章 爱限免手机应用开发技术简介

该部分主要包括对iOS系统架构的分析、核心操作系统的分析、应用程序框架的分析、内核的分析、开发环境的配置信息、选用数据库描述信息等,具体如下:

2.1 Objective-c简介

Objective-C是非常“实际”的语言。它使用一个用C写成、很吊的运行库,只会令应用程序的占得内存增加很小。OC写成的程序通常不会比其源代码大很多。而其函数库(通常附在软件发行本)亦和Smalltalk系统要使用极大的内存来开启一个窗口的情况相反。Objective-C的最初版本并不支持垃圾回收。在当时这是争论的焦点之一,很多人考虑到Smalltalk回收时有漫长的“死亡时间”,令整个系统失去功用。Objective-C为避免此问题才不拥有这个功能。虽然某些第三方版本已经加入这个功能(尤其是GNUstep),再起Mac OS X 10.3中仍未引入这个功能。不过令人欣慰的是在Apple发布的XCode4中已经支持自动释放,我不敢冒昧的说那是垃圾回收,因为两者机制不同,在xCode4中的自动释放,也就是ARC(Automatic Reference Counting)机制,是不需要用户手动去Release一个对象,而是在编译期间,编译器会自动帮你添加那些以前你经常写[NSObject release]。

另一个问题是OC不包括命名空间机制(namespace mechanism)。取而代之的是程序设计师必须在其类别名称加上前缀,时常引致冲突。在2004年,在Cocoa编程环境中,所有Mac OS X类别和函式均有“NS”作为前缀,例如NSobject或NSButton来清楚分别它们属于Mac OS X核心;使用“NS”是由于这些类别的名称在NeXTSTEP开发时定下。虽然Objective-C是C的母集,但它也不是C的基本型别为第一级的对象。和C++不同,Objective-C不支援运算子多载(它不支持ad-hoc多型)。亦与C++不同,但和Java相同,Objective-C只容许对象继承一个类别(不设多重继承)。Categories和protocols不但可以提供很多多重继承的好处,而且没有很多缺点,例如额外执行时间过重和二进制不兼容。由于OC使用动态运行时类型,而且所有的方法都是函数调用(有时甚至连系统调用(syscalls)也如此),很多常见的编译时性能优化方法都不能应用于OC(例如:内联函数、常数传播、交互式优化、纯量取代与聚集等)。这使得OC性能劣于类似的对象抽象语言(如C++)。不过OC拥护者认为既然OC运行时消耗较大,OC本来就不应应用于C++或Java常见的底层抽象

河南理工大学毕业设计(论文)说明书

2.1.1 ios系统

Cisco的网际操作系统(IOS)是一个为网际互连优化的操作系统--类似一个局域操作系统(NOS)、如Novell的 NetWare,为LANs而进行优化。IOS为长时间有效地维护一个互联网络提供了统一的规则。简而言之,它是一个与硬件分离的软件体系结构,随网络技术的不断发展,可动态地升级以适应不断变化的技术

IOS可以被视作一个网际互连中枢。一个高度智能的管理员,负责管理、控制复杂的分布式网络资源。其早期版本是一个单独系统,基本上以路由器为中心。它被排列成一个过程(Procedure)集,允许任何过程之间相互呼叫。这种单一的结构使数据的隐蔽性和独立性不强。它的大多数操作代码拥有结构和操作的相关性

iPHONE是Mac出的封闭手机系统,iPhone相对要稳定,不开放源代码的,扩展相对不足,移植性很好!iPhone开发用的是Objective-C(一种C语言的第三方拓展版),从众面小,不能定制UI(界面),只能进行功能解锁 比如:越狱.iPhone定位于高端手机市场,走的是个性化路线,主要优势是AppStore(移动网上商店),Mac拥有全球最大最成熟的移动网上商店

1.模块性

IOS是Cisco路由软件的初始品牌名称。随着Cisco技术的发展,IOS不断扩展,成为Cisco Central ENgineering(中央工程部门)所称之为的“一系列紧密连接的网际互连软件产品”。尽管在其品牌名识别中,IOS可能仍然等同于路由软件,但是它的持续发展发已使之过渡到支持局域网和ATM交换机,并为网络管理应用提供重要的代理功能。必须强调的是,IOS是Cisco开发的技术:一项企业资产。它给公司提供独特的市场竞争优势。许多竞争者许可IOS在其集线器和中由模块内运行,IOS已尼广泛成为网际互连软件事实上的工业标准。

2.灵活性

基于Cisco产品的工程开发以用户可以获得适应变化的灵活性。IOS软件提供一个可扩展的平台,Cisco会随着需求和技术的发展集成新的功能。Cisco可以更快地将新产品投向市场,我们的客户可以享用这种优势。

3.可伸缩性

IOS遍布网际互连市场;广泛的Cisco使用伙伴及竞争者在他们的产品上支 6

河南理工大学毕业设计(论文)说明书

持IOS.IOS软件体系结构还允许其集成构造企业互联网络的所有部分。Cisco已经定义了4个:核心/中枢:网络中枢和WAN服务,包括大型骨干网络路由器和ATM交换机。工作组:从共享型局域网移植到局域网交换(VLANs)提供更优的网络分段和性能。)远程访问:远程局域网连接解决方案;边际路由器、调制解调器等。IBM网际互连:SNA和LAN并行集成,从SNA转换到IP.Cisco的IOS扩展了所有这些领域,提供了支持端到端网际互连的稳健性。

4.可操作性

IOS提供最广泛的基于标准的物理和逻辑协议接口——超过业界任何其他供应商:从双绞线到光纤,从局域网到园区网到广域网,Novell NetWare,UNIX,SNA以及其他许多接口。即是说,一个围绕IOS建立的网络将支持非常广泛的应用。

2.1.2核心操作系统层和核心服务层

位于iOS系统架构最下面的一层是核心操作层,它包括内存管理,文件管理,电源管理以及一些其他的操作系统业务,它可以直接和硬件设备交互。核心操作系统层包括以下这些组件:OS X Kernel,Mach 3.0,BSD,Sockets,Power Mgmt,File System Keychain,Certificates,Security,Bonjour等

开发人员也可以完全访问核心服务层来方问iOS的一些服务,包括数据库连接,URL学习等等,它主要包括以下这些组件:Collections,Addre Book,Networking,File Acce,SQLite,Core Location,Net Services,Threading,Preferences,URL Utilities等。

SQLite是嵌入式的和轻量级的sql数据库,广泛用于iOS应用。iOS系统内置SQLite数据库减小了开发人员的负担,是系统的一部分。

Net Servicer主要负责网络服务,在开发过程中,承担应用程序与服务器之间连接的角色,有很强的交互性。

媒体层,通过它可以在应用程序中使用各种媒体文件,进行音频与视频的录制,图形的绘制,以及制作基础的动画效果。它包括以下这些组件:Core Audio,OpenGL,Audo Mixing,AudioRecording,VideoPlayback,JPG,PBG,TIFF,PDF,Quartz,CoreAnimation,OpenGL ES。最上面一层是可触摸层,这一层为应用开发提供了各种有用的框架,并且大部分与用户界面有关,本质上来说它负责用户在iOS设备上的触摸交互操作。它包括以下这些组件:Multi-Touch Events,Core Motion,Camera,View Hierarchy,Localization,Alerts,Web Views,Image 7

河南理工大学毕业设计(论文)说明书

Picker,Multi-Touch Controls。

在Cocoa Touch层中的很多技术都是基于Objective-C语言的。Objective-C语言为iOS提供了相机集合,文件管理,网络操作等支持。例如UIKit框架,它为应用程序提供了各种可视化组件,窗口(window),视图(view)和按钮组件(UIButton)。Cocoa Touch层中的其他框架,对我们在应用程序中的开发来说也是非常有用的,如访问用户通信录功能框架,获取照片信息功能的框架,负责加速感应器和三维陀螺仪等硬件支持的框架等等。

2.1.3应用程序框架

编写应用程序项目,都是从CocoaTouch层开始的,具体来说是从UIKit Framework开始的。iOS常用的SDK框架如下:

AddreBook.framework 提供访问存储核心数据库中用户联系人信息的功能。

AddreBook.framework提供一个用户界面,用于显示存储在地址薄中的联系人详情。

AudioUnit.framework提供一个接口,让我们的应用程序可以对音频进行处理。

AudioToolbox.framework和AVFoundation.framework提供音频录制和回放的底层API,同时也负责管理音频硬件。

CFNetwork.framework访问和配置网络,像HTTP,FTP和Bonjour Services等。

CoreFoundation.framework提供抽象的常用数据类型,如Unicode、strings、XML、URL等。

CoreGraphics.framework提供2D绘制的基于C的API。

Foundation.framework提供Object-C的基础类(像NSObject)、基本数据类型和操作系统服务等。

GameKit.framework为游戏提供网络功能,点对点互联和游戏中的语音交流。 MapKit.framework为应用程序提供内嵌地图的接口。 MediaPlayer.framework提供视频播放和音频的功能。

MeageUI.framework提供视图控制接口用以处理E-mail和短信。 OpenGLES.framework提供简洁而高效的绘制2D和3D图形的OpenGL API。 QuartzCore.framework提供动画特效以及通过硬件进行渲染的能力。

河南理工大学毕业设计(论文)说明书

StoreKit.framework为应用程序提供在程序运行中消费的支持。 SystemConfiguration.framework检测当前网络是否可用和硬件设备状态的能力。

2.2 SQLite数据库介绍

SQLite是一个轻量级、跨平台的关系型数据库。既然号称关系型数据库,支持SQL92标准中常用的事务(比如视图、事务、触发器等)就是理所当然的了,具体特色有以下几点:

1.轻量级

先说它的第一个特色:轻量级。想必SQLite的创建者很看重这个特性,连它的Logo都是用的“羽毛”,来显摆它的轻飘飘。SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态 库,就可以享受它的全部功能。而且那个动态库的尺寸也挺小,以版本3.6.11为例,Windows下487KB、Linux下347KB等。

2.绿色软件

SQLite的另外一个特点是绿色:它的核心引擎本身不依赖第三方的软件,使用它也不需要“安装”。所以在部署的时候能够省去不少麻烦。

3.单一文件

所谓的“单一文件”,就是数据库中所有的信息(比如表、视图、触发器、等)都包含在一个文件内。这个文件可以copy到其它目录或其它机器上,也照用不误。

4.跨平台/可移植性

如果光支持主流操作系统,那就没啥好吹嘘的了。除了主流操作系统,SQLite还支持了很多冷门的操作系统。我个人比较感兴趣的是它对很多嵌入式系统(比如Android、Windows Mobile、Symbin、Palm、VxWorks等)的支持。

5.内存数据库(in-memory database)

SQLite的API不区分当前操作的数据库是在内存还是在文件(对于存储介质是透明的)。所以如果你觉得磁盘I/O有可能成为瓶颈的话,可以考虑切换为内存方式。切换的时候,操作SQLite的代码基本不用大改,只要在开始时把文件Load到内存,结束时把内存的数据库Dump回文件就OK了。

河南理工大学毕业设计(论文)说明书

2.3 XCode Xcode2.0是开发人员建立Mac OS X应用程序的最快捷方式,也是利用新的苹果电脑公司技术的最简单的途径。Xcode2.0将Mac OSX的轻松使用,UNIX 能量以及高性能的开发技术集合在一起。

不管你用C、C++、Objective-C或 Java编写程序,在AppleScript里编写脚本,还是试图从另一个奇妙的工具中转移编码,你会发现Xcode编译速度极快。每次操作都很快速和轻松。

Xcode4的虚拟模型和设计功能让你可以更轻松的开发和维护应用程序。只需选择应用程序中想要编写的部分,然后模型和设计系统将自动创建分类图表,不仅可以显示编码,还可以让你进行浏览。Mac OS X Core Data API 帮你的应用程序创建数据结构。更棒的是,它还自动提供撤消、重做和保存功能,无需编写任何编码。

Xcode整合的 Apple Reference Library为所有的Apple开发者文件提供一个单独的搜索和显示界面,这些文件包括来自苹果电脑公司网站的在线文件,以及存放在你电脑上的文件。新的参考资料库甚至可以帮你将定期更新资料下载到你的电脑,保持文件的最新状态。Xcode 将帮你快速找到最新的答案。

Xcode4的核心部分是苹果电脑公司下一代业界标准的gcc编译器gcc4.0。新的编译器利用许多先进的最优化技术帮你从现存编码中获得更多性能。从超级计算世界借鉴来的自动向量化(Auto-vectorization)技术可以帮助你释放每台 Intel 系统中速度引擎的能量,而不需要编写向量化编码。其他的最优化工具则支持反馈定向的最优化,以及隐藏模块分析。

Xcode 将赋予你创建诸如计算和渲染引擎应用程序的能力,这些应用程序使用64位内存定址。这非常适合数据集中的应用程序,其通过访问内存中的数据运行速度更快,远胜于磁盘访问。Xcode将为你提供工具来建立并调试适合 IntelCore i5, i7 和Mac OSX Lion的32或64位应用程序,还可以让你创建包含32位和64位执行能力的 Fat Binaries。

众所周知,在构建中引进多重处理器可以提高速度,Xcode 能帮你实现这个明显的结论。利用支持 Rendezvous 的分布式构建功能,可以轻易地把编译工作量分散到闲置的电脑上来寄放构建,或者更好是在单独的电脑上开发一个专门的 Xserve 构建寄放区,快速处理那些耗时的任务。

河南理工大学毕业设计(论文)说明书

第3章 爱限免手机应用app需求分析

根据第一章所定义的课题研究方向及目标,本章将对系统功能进行具体的需求分析,具体分析爱限免app所要实现的功能以及欲达到的效果,具体内容如下章节:

3.1 爱限免手机应用app的可行性分析

1.使用objective-c编程技术

Objective-c是非常实际的语言,他是一个用c写成、很小的运行库,只会令程序的尺寸增加很小,和大部分oo系统使用极大的vm执行时间会取代整个系统运作相反,Objective-c写的程序通常不会比起原始代码大很多,而其函数库亦和Smalltalk系统要使用极大的内存来开启一个窗口的情况相反,因objective-c它完全兼容标准c语言,c语言具有的高效性也被objective-c继承,但是我们用的objective-c并不像c语言用起来那么的复杂,因为它是对c的封装,把复杂高效的语言变得简单高效,这样更利于ios开发者使用,也为iOS开发者带来了便捷。 (1)动态绑定

函数和消息的最根本不同是:函数和它的参数是在编译的时候已经确定下来,但是消息和接收对象知道程序已经在运行,消息在传递时才能确定下来。确切的消息方法实现依赖于消息的接收者,不同的接收者可能有相同的方法名不同的方法实现,只有在消息接收时才能确定(动态类型),通过源代码的类型定义并不能完全确认接收者的类型。运行时消息例程查找接收者和消息方法,找到消息方法实现的机器码,呼叫这个方法,传递给它消息实例变量指针 (2)多态性

在Objective-c中消息的调用看上去和标准C中的函数调用相似,但因为方法属于一个对象,消息的行为与函数调用还是不同。在一些情况下,一些对象仅能对针对它涉及的方法起作用,不能被其他类的方法使用,即使这些类有同样名称的方法。这意味着两个对象对同样的消息有着不同的响应,即多态性。Objective-c中多态性和动态绑定配合使用,可以使代码提供给任意数量不同类型的对象使用,这些对象不需要再写代码的时候就已经定义好,它们可以是以后开发的对象,也可以是其他项目的对象。 (3)面向对象

面向对象程序构建在多种对象之上,基于Cocoa框架的程序可能使用

河南理工大学毕业设计(论文)说明书

NSMatrix对象、NSWindow对象、NSDirectonary对象、NSFont对象以及许多其它对象。在Objective-c中通过定义类来定义对象。面向对象让开发者更容易开发应用程序软件,以及更加规范化 (4)继承性

类的定义是累进的,任一个新类都是在另一个类的基础上定义的,新类继承了它的方法和实例变量。继承使所有的类构成一颗树形的结构,在Objective-c中使用类一般要继承或间接继承于基类:NSObject,因为NSObject提供了大量的有用特性。比如,一些图形类,需要继承于Shape类,而Shape是Graphic类的子类,Graphic又继承于NSObject类,因此,还是间接继承于NSObject类。类的继承关系图3-1所示:

图3-1 Objective-C类继承图

在项目中NSObject集合了所有类的基本方法,所有的=类都继承或者间接继承NSObject。 2.社会市场因素可行性

如今社会发展迅速,手机行业更是赤手可热,手机应用的开发也是更新换代比较频繁,一款好的手机软件商店,不仅能适应市场的发展方向,更是为广大用户带来福利以及便捷。

按照目前市场情形,越来越多的移动开发者涌进iOS开发领域。iOS平台上应用软件,App Store的支付模式更为成熟而且有监管,另外iOS的兼容性问题小,开发人员不用考虑太多的配置兼容问题,美观大方的外形,更是吸引了大量

河南理工大学毕业设计(论文)说明书

的用户。而且其良好的用户体验,都为iOS的发展奠定了良好的基础。 3.硬件工具可行性

使用工具方面,开发工具ios xcode6.0版本,要求mac10.8操作系统,一台已经安装有所有必备的软件及相应软件设备的计算机;内存要求大于或等于2G。

3.2 爱限免手机应用app功能需求分析

爱限免手机应用app,设计5个模块,每个模块各司其职,在整个工程中又到了MVC模式,单例模式,block模式,是每个功能模块化各模块之间的联系降到最低,使得每个模块都类似一个小型的家庭,每个成员各司其职,这样就降低了程序的耦合性有利于后期代码的维护,模块化的设计也使得你的app看起来更有你条理性,下边就是对模块化的图文解释,具体如图3-2-1:

图3-2-1 模块展示

河南理工大学毕业设计(论文)说明书

此图清晰的展示了app的5个功能模块,首相是上边的5个大模块,由一个分栏控制器UITablebarController控制,把这5各模块放到分栏控制器数组中进行控制,如图3-2-1设一个搜索控制器和一个详情控制器,通过正反向传值把5大功能模块的信息传到这两个控制器上边进行显示,其中在详情页面还有收藏分享工能,收藏使用了一个数据库进行装载数据,分享实在MOb注册了开发者 根据官方文档进行了qq空间分享(需要有qq空间客户端才行)。

3.2.1 功能需求

1.App应用的查看功能需求

此项目分别有5各视图控制器viewcontroller分别有系统的分栏控制器tabbaicontroller控制,可以根据下标来回相互切换,每个视图控制器上边都有一个表格控制器UITableview来进行展示数据内容,由于数据的内容各不相同,表格控制器还需要适应每个数据的变化,视图控制器之间还可以相互跳转,一般都是通过压栈的形势来进行跳转。 2.App应用详情查看表功能需求

应用详情的展示由xib可视化编程和代码两者结合实现,可以展示商品的图片、大小、类型、详情介绍等内容,还有周边推荐,可以看到周边人的app,以经纬度来确定摸个区域。 3.在线搜索应用功能需求

搜索功能有uiseacrbar来实现,通过app的名字,汉字英文都可以,通过代理方法把输入框里边的内容和数据中的信息对比,有相同的就保存到数组中,再通过UItableview展示到界面上来。 4.在线app分享功能需求

分享的第三放有很多,我这里只用mob进行空间分享,这个功能需要开发者注册开发者账号,在官网上下载分享文档,提取核心代码,分享的实现有mob完成。

5.App收藏功能需求

App的收藏这里与运用了数据库,可以通过点击事件把你点击的app加到数据库中,再在相应的界面进行信息展示。 6.App图片保存功能需求

通过点击事件来触发收藏相册的代理事件,把相应的图片收藏到相册,打开相册即可观看。

河南理工大学毕业设计(论文)说明书

7.App应用设置的功能需求

这里的app设置功能只做了,对收藏的app进行删除的操作。

河南理工大学毕业设计(论文)说明书

第4章 爱限免手机应用app设计

系统设计阶段主要的任务是系统各个模块的具体设计与实现。

4.1 模块功能设计

下面以具体的效果来展示各个功能模块。

4.1.1 限免模块

1实现显示免费app的展示 2 对限时免费app的详情查看 3对现实免费app的时间倒计时 4 app基本信息的显示

限免功能模块运行效果图如下4.1.1-1, 4.1.1-2所示

图4.1.1-1限免界面

此图为限免模块的展示,如图界面由一个uitableview覆盖真个屏幕,商品在每个cell上进行信息展示,具体的设计由xib完成,下面展示cell的设计:

下边我就用代码来展示一下这个界面的实现: 首先是对网络数据的请求startTime;

cell.surplusTimeLabel.text = [NSString stringWithFormat:@\"剩余:%.2lld:%.2lld:%.2lld\",time/3600,time%3600/60,time%60];

}else{

AppMode1 *mode = _searchArr[indexPath.row];

cell.nameLabel.text = mode.name;

cell.iconImage.image = [UIImage imageWithData:mode.iconData];

cell.lastPriceLabel.text = [NSString stringWithFormat:@\"¥ %.1f\",[mode.lastPrice floatValue]];

cell.categoryLabel.text = [mode.categoryName isEqualToString:@\"Game\"]?@\"游戏\":@\"应用\";

cell.countLabel.text = [NSString stringWithFormat:@\"分享:%@次 收藏:%@次 下载:%@次\",mode.shares,mode.favorites,mode.downloads];

//处理 星星

cell.starImageView.frame = CGRectMake(cell.starImageView.frame.origin.x, cell.starImageView.frame.origin.y, 65/5.0*[mode.starOverall floatValue], cell.starImageView.frame.size.height);//修改fream

河南理工大学毕业设计(论文)说明书

//处理 倒计时问题

NSDate *date = [NSDate date];

long long startTime = (long long)[date timeIntervalSince1970];

NSString *str = [mode.surplusTime componentsSeparatedByString:@\".\"][0];

NSDateFormatter *fo = [NSDateFormatter new];

fo.dateFormat = @\"YYYY-MM-dd HH:mm:\";

NSDate *endDate = [fo dateFromString:str];

long long endTime = (long long)[endDate timeIntervalSince1970];

long long time = endTime(UITableViewCell

*)tableView:(UITableView

*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@\"cell\"];

if (tableView == _tableView) {

AppMode1 *mode = _dataArr[indexPath.row];

cell.nameLabel.text = mode.name;

cell.iconImage.image = [UIImage imageWithData:mode.iconData];

cell.lastPriceLabel.text = @\"¥ 0.0\";

cell.categoryLabel.text = [mode.categoryName isEqualToString:@\"Game\"]?@\"游戏\":@\"应用\";

cell.countLabel.text = [NSString stringWithFormat:@\"分享:%@次 收藏:%@次 下载:%@次\",mode.shares,mode.favorites,mode.downloads];

//处理 星星--下面两项 在xib中已经处理过

//

cell.starImageView.contentMode = UIViewContentModeLeft;//设置图片填充方式

//

cell.clipsToBounds = YES;//设置 自动切割超出自身fream的部分

cell.starImageView.frame cell.starImageView.frame.origin.y,

=

CGRectMake(cell.starImageView.frame.origin.x, 65/5.0*[mode.starOverall

floatValue], cell.starImageView.frame.size.height);//修改fream

cell.surplusTimeLabel.text = [NSString stringWithFormat:@\"评分:%.2f分\",[mode.starOverall floatValue]];

}else{

AppMode1 *mode = _searchArr[indexPath.row];

cell.nameLabel.text = mode.name;

cell.iconImage.image = [UIImage imageWithData:mode.iconData]; 25

河南理工大学毕业设计(论文)说明书

cell.lastPriceLabel.text = @\"¥ 0.0\";

cell.categoryLabel.text = [mode.categoryName isEqualToString:@\"Game\"]?@\"游戏\":@\"应用\";

cell.countLabel.text = [NSString stringWithFormat:@\"分享:%@次 收藏:%@次 下载:%@次\",mode.shares,mode.favorites,mode.downloads];

//处理 星星

cell.starImageView.frame cell.starImageView.frame.origin.y,

=

CGRectMake(cell.starImageView.frame.origin.x, 65/5.0*[mode.starOverall

floatValue], cell.starImageView.frame.size.height);//修改fream

cell.surplusTimeLabel.text = [NSString stringWithFormat:@\"评分:%.2f分\",[mode.starOverall floatValue]];

}

UILabel *lebel = (UILabel *)[cell.contentView viewWithTag:10];

lebel.hidden = YES;

return cell; } 4.2.2 专题模块

1按照一定的专题分类显示 运行效果图如下4.2.2-1

图4.2.2-1 专题界面

26

河南理工大学毕业设计(论文)说明书

专题界面实现如图所示,从图上不难看出这个界面的cell复杂得多,这个cell上不仅仅是一个app的展示,而是集合了多个app,每个app都显示不同的信息,而且点击每个app都会显示对应的商品详情,在这里处理这个就用到了block传值,下面对界面的设计进行代码展示,首先是请求数据的展示: AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

[manager GET:PAGE_D_URL parameters:@{@\"page\":@\"1\",@\"limit\":@\"5\"} succe:^(AFHTTPRequestOperation *operation, id responseObject) {

NSArray *arr = responseObject;

for (int i=0; i

AppMode4 *mode = [[AppMode4 alloc]init];

mode.title0 = arr[i][@\"title\"];

mode.imageUrlStr1 = arr[i][@\"img\"];

mode.imageUrlStr6 = arr[i][@\"desc_img\"];

mode.title5 = arr[i][@\"desc\"];

mode.title1 = arr[i][@\"applications\"][0][@\"name\"];

mode.title2 = arr[i][@\"applications\"][1][@\"name\"];

mode.title3 = arr[i][@\"applications\"][2][@\"name\"];

mode.title4 = arr[i][@\"applications\"][3][@\"name\"];

mode.imageUrlStr2 = arr[i][@\"applications\"][0][@\"iconUrl\"];

mode.imageUrlStr3 = arr[i][@\"applications\"][1][@\"iconUrl\"];

mode.imageUrlStr4 = arr[i][@\"applications\"][2][@\"iconUrl\"];

mode.imageUrlStr5 = arr[i][@\"applications\"][3][@\"iconUrl\"];

mode.star1 = arr[i][@\"applications\"][0][@\"starOverall\"];

mode.star2 = arr[i][@\"applications\"][1][@\"starOverall\"];

mode.star3 = arr[i][@\"applications\"][2][@\"starOverall\"];

mode.star4 = arr[i][@\"applications\"][3][@\"starOverall\"];

mode.btnTitle1_1 = arr[i][@\"applications\"][0][@\"comment\"];

mode.btnTitle1_2 = arr[i][@\"applications\"][0][@\"downloads\"];

mode.btnTitle2_1 = arr[i][@\"applications\"][1][@\"comment\"];

mode.btnTitle2_2 = arr[i][@\"applications\"][1][@\"downloads\"]; 27

河南理工大学毕业设计(论文)说明书

mode.btnTitle3_1 = arr[i][@\"applications\"][2][@\"comment\"];

mode.btnTitle3_2 = arr[i][@\"applications\"][2][@\"downloads\"];

mode.btnTitle4_1 = arr[i][@\"applications\"][3][@\"comment\"];

mode.btnTitle4_2 = arr[i][@\"applications\"][3][@\"downloads\"];

_IDarray = @[arr[i][@\"applications\"][0][@\"applicationId\"],arr[i][@\"applications\"][1][@\"applicationId\"],arr[i][@\"applications\"][2][@\"applicationId\"],arr[i][@\"applications\"][3][@\"applicationId\"]];

[_IDMUarray addObject:_IDarray];

[_dataArr addObject:mode];

}

[_tableView reloadData];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

}]; } 下面展示cell的赋值问题,这里我们会为每个app打上标签,一遍我们在传值的时候能辨认我们还点击的是哪个app。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

CustomCell_D *cell = [tableView dequeueReusableCellWithIdentifier:@\"cell\"];

cell.array = _IDMUarray[indexPath.row];

AppMode4 *mode = _dataArr[indexPath.row];

[cell setBlock:^(NSString *ID) {

ViewControllerA_2 *viewCtl_2 = [[ViewControllerA_2 alloc]init];

viewCtl_2.appId = ID;

[self.navigationController pushViewController:viewCtl_2 animated:YES];

}];

[cell.myImageView1 setImageWithURL:[NSURL

URLWithString:mode.imageUrlStr1] placeholderImage:[UIImage imageNamed:@\"topic_TopicImage_Default\"]];

[cell.myImageView2 setImageWithURL:[NSURL

URLWithString:mode.imageUrlStr2] placeholderImage:[UIImage

28

河南理工大学毕业设计(论文)说明书

imageNamed:@\"topic_TopicImage_Default\"]];

[cell.myImageView3 setImageWithURL:[NSURL

URLWithString:mode.imageUrlStr3] placeholderImage:[UIImage imageNamed:@\"topic_TopicImage_Default\"]];

[cell.myImageView4 setImageWithURL:[NSURL

URLWithString:mode.imageUrlStr4] placeholderImage:[UIImage imageNamed:@\"topic_TopicImage_Default\"]];

[cell.myImageView5 setImageWithURL:[NSURL

URLWithString:mode.imageUrlStr5] placeholderImage:[UIImage imageNamed:@\"topic_TopicImage_Default\"]];

[cell.myImageView6 setImageWithURL:[NSURL

URLWithString:mode.imageUrlStr6] placeholderImage:[UIImage imageNamed:@\"topic_TopicImage_Default\"]];

cell.myLabel1.text = mode.title1;

cell.myLabel2.text = mode.title2;

cell.myLabel3.text = mode.title3;

cell.myLabel4.text = mode.title4;

cell.myLabel5.text = mode.title5;

[cell.btn1_2 setTitle:mode.btnTitle1_2 forState:UIControlStateNormal];

[cell.btn1_1 setTitle:[NSString stringWithFormat:@\"%@\",mode.btnTitle1_1] forState:UIControlStateNormal];

[cell.btn2_2 setTitle:mode.btnTitle2_2 forState:UIControlStateNormal];

[cell.btn2_1 setTitle:[NSString stringWithFormat:@\"%@\",mode.btnTitle2_1] forState:UIControlStateNormal];

[cell.btn3_2 setTitle:mode.btnTitle3_2 forState:UIControlStateNormal];

[cell.btn3_1 setTitle:[NSString stringWithFormat:@\"%@\",mode.btnTitle3_1] forState:UIControlStateNormal];

[cell.btn4_2 setTitle:mode.btnTitle4_2 forState:UIControlStateNormal];

[cell.btn4_1 setTitle:[NSString stringWithFormat:@\"%@\",mode.btnTitle4_1] forState:UIControlStateNormal];

cell.star1.frame = CGRectMake(cell.star1.frame.origin.x, 29

河南理工大学毕业设计(论文)说明书

cell.star1.frame.origin.y, 65/5.0*[mode.star1 floatValue], cell.star1.frame.size.height);

cell.star2.frame = CGRectMake(cell.star2.frame.origin.x, cell.star2.frame.origin.y, 65/5.0*[mode.star2 floatValue], cell.star2.frame.size.height);

cell.star3.frame = CGRectMake(cell.star3.frame.origin.x, cell.star3.frame.origin.y, 65/5.0*[mode.star3 floatValue], cell.star3.frame.size.height);

cell.star4.frame = CGRectMake(cell.star4.frame.origin.x, cell.star4.frame.origin.y, 65/5.0*[mode.star4 floatValue], cell.star4.frame.size.height);

return cell; } 4.2.3 分享功能模块

1实现了分享的功能 运行效果图如下4.2.3-1

图4.2.4-1 点击分享默认界面

在这里分享功能我用了mob第三方分享,通郭mob给的官方文档,导入系统库,就可以实现分享功能,具体代码如下展示:

//注册shareSDK

[ShareSDK registerApp:@\"74f6b479a893\"];

//添加QQ空间应用

注册网址

http://connect.qq.com/intro/login/

[ShareSDK connectQZoneWithAppKey:@\"1104627452\"

appSecret:@\"Usc84bJXmMeTzNCI\"

qqApiInterfaceCls:[QQApiInterface cla]

tencentOAuthCls:[TencentOAuth cla]];

30

河南理工大学毕业设计(论文)说明书

//添加QQ应用

注册网址

http://open.qq.com/

[ShareSDK connectQQWithQZoneAppKey:@\"1104627452\"

qqApiInterfaceCls:[QQApiInterface cla]

tencentOAuthCls:[TencentOAuth cla]];

//分享点击事件

- (IBAction)shareButton:(id)sender {

//构造分享内容

id publishContent = [ShareSDK content:@\"分享内容\"

defaultContent:@\"测试一下\"

image:[ShareSDK imageWithPath:nil]

title:@\"ShareSDK\"

url:@\"http://www.daodoc.com\"

description:@\"这是一条测试信息\"

mediaType:SSPublishContentMediaTypeNews];

//创建弹出菜单容器

id container = [ShareSDK container];

[container setIPadContainerWithView:sender arrowDirect:UIPopoverArrowDirectionUp];

//弹出分享菜单

[ShareSDK showShareActionSheet:container

shareList:nil

content:publishContent

statusBarTips:YES

authOptions:nil

shareOptions:nil

result:^(ShareType type, SSResponseState state, id statusInfo, id error, BOOL end) {

if (state == SSResponseStateSucce)

{

NSLog(NSLocalizedString(@\"TEXT_ShARE_SUC\", @\"分享成功\"));

}

else if (state == SSResponseStateFail)

{

31

河南理工大学毕业设计(论文)说明书

NSLog(NSLocalizedString(@\"TEXT_ShARE_FAI\", @\"分享失败,错误码:%d,错误描述:%@\"), [error errorCode], [error errorDescription]);

}

}]; } 4.2.4 收藏功能模块

1显示你是否收藏成功 运行效果图如下4.2.5-1

图4.2.4-1 点击收藏显示界面

收藏功能我这里使用了一个ios本地数据库codata也是对sqlite的封装,这里使用了ios的单例模式,把这个数据库写在中转站中,形成一个单例,所谓的单例就是在整个项目工程中只会被实例化一次,不会重复多次实例化,确保每次取到的都是同一个数据库,代码如下

@interface AppDelegate : UIResponder

@property (strong, nonatomic) UIWindow *window;

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator

32

河南理工大学毕业设计(论文)说明书

*persistentStoreCoordinator;

在没次收藏成功的时候都会有一个提示图标,就是图里边的温馨提示,这里使用了一个 UIAlertView 来实现这个功能具体代码如下:

//赋值头像

AFHTTPRequestOperationManager *man = [AFHTTPRequestOperationManager manager];

man.responseSerializer = [AFHTTPResponseSerializer serializer];

[man GET:_myIconUrl parameters:nil succe:^(AFHTTPRequestOperation *operation, id responseObject) {

mode.iconData = responseObject;

//存储数据

[dele.managedObjectContext save:nil];

//弹出提示 收藏成功

UIAlertView *alv = [[UIAlertView alloc]initWithTitle:@\"温馨提示\" meage:@\"收藏成功\" delegate:self cancelButtonTitle:@\"知道了\" otherButtonTitles:nil, nil];

[alv show];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

}]; 下面就是收藏功能的实现,这里收藏功能是通过appdelegate把实例化的数据库在相应的控制器种取到,把要收藏的app添加到数据库中实现本地化存储,从而实现收藏,具体代码如下:

//取得 实体对象

AppDelegate *dele = [UIApplication sharedApplication].delegate;

AppMode *mode = [NSEntityDescription insertNewObjectForEntityForName:@\"AppMode\" inManagedObjectContext:dele.managedObjectContext];

//赋值

mode.appId = self.appId; 33

河南理工大学毕业设计(论文)说明书

mode.name = _myName; 这样就把喜欢的app进行了收藏,由于这个数据库是被写成了单例,因此里边的数据是会不断更新的,而数据内容就是收藏的app,在需要展示的界面取出来数据库进行刷表就可以实现展示,具体代码如下:

[_arr2 removeAllObjects];

//从数据库取出收藏的app

AppDelegate *delegate = [UIApplication sharedApplication].delegate;

NSFetchRequest *request = [NSFetchRequest new];

request.entity = [NSEntityDescription entityForName:@\"AppMode\" inManagedObjectContext:delegate.managedObjectContext];

_arr = [delegate.managedObjectContext executeFetchRequest:request error:nil];

//创建一个 滚动视图,高度根据需要改变

_sView = [[UIScrollView alloc]initWithFrame:self.view.bounds];

_sView.frame= CGRectMake(0, 50, self.view.bounds.size.width, self.view.bounds.size.height);

[self.view addSubview:_sView];

_sView.contentSize = CGSizeMake(self.view.bounds.size.width, 50+(_arr.count /3 +1)*100);

//根据收藏的app个数 创建图标

for (int i =0; i

UIImageView *view = [[UIImageView

alloc]initWithFrame:CGRectMake(30+i%3*100, 50+i/3*100, 60, 60)];

//打开人机交互开关

view.userInteractionEnabled = YES;

view.image = [UIImage imageWithData:[_arr[i] iconData]]; 34

河南理工大学毕业设计(论文)说明书

view.tag = 600+i;

UILabel *label = [[UILabel

alloc]initWithFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y + 60, 60, 20)];

label.textAlignment = NSTextAlignmentCenter;

label.font = [UIFont systemFontOfSize:12];

label.text = [_arr[i] name];

[_sView addSubview:label];

[_sView addSubview:view];

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(gesAction:)];

[view addGestureRecognizer:tap];

//创建 删除小图标

UIImageView *view2 = [[UIImageView alloc]initWithFrame:CGRectMake(-10, -10, 70, 70)];

//打开人机交互开关

view2.userInteractionEnabled = YES; //

view2.backgroundColor = [UIColor lightGrayColor];

view2.contentMode = UIViewContentModeTopLeft;

view2.image = [UIImage imageNamed:@\"close\"];

//添加到 图标视图上

[view addSubview:view2];

//判断是否 隐藏 删除小图标

if (!_btn.selected) {

view2.hidden = YES;

}

//添加手势

UITapGestureRecognizer *tap2 = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(deleteGesAction:)];

[view2 addGestureRecognizer:tap2]; 35

河南理工大学毕业设计(论文)说明书

//添加到数组

[_arr2 addObject:view2]; App的删除功能也是在这里实现的,通过点击设置按钮,使app的图标显示删除“×”,点击,把它从数据库中删掉,刷新数据,代码如下: //删除收藏的数据

-(void)deleteGesAction:(UIGestureRecognizer *)ges{

//根据点击的view 获取角标------正好相对应 要删除的app在arr中的角标

NSInteger index = [_arr2 indexOfObject:ges.view]; //

NSLog(@\"%ld\",index);

//从数据库取出收藏的app

AppDelegate *delegate = [UIApplication sharedApplication].delegate;

//删除

[delegate.managedObjectContext deleteObject:_arr[index]];

[delegate.managedObjectContext save:nil];

//刷新页面

[_sView removeFromSuperview];

[self loadData]; 4.2.5 搜索功能模块

1实现app名字搜索显示 2 点击可以查看信息 运行效果图如下4.2.5-1,

36

河南理工大学毕业设计(论文)说明书

图4.2.5-1 搜索结果界面

搜索界面的实现实在原有界面的基础上加上实现代理方法,用uiseachbar来实现app的搜索功能核心代码如下

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{

//清空搜索结果数组

[_searchArr removeAllObjects];

for (AppMode1 *mode in _dataArr) {

if ([mode.name rangeOfString:searchString].location != NSNotFound ) {

[_searchArr addObject:mode];

}

}

return YES; } 37

河南理工大学毕业设计(论文)说明书

第5章 系统测试

系统测试是保证系统质量和可靠性的关键步骤,是对系统开发过程中的系统分析系统设计和实施的最后复查。根据测试的概念和目的,在进行信息系统测试。

5.1 功能模块测试

1.限免模块的测试,主要测试、接口数据是否能正确显示,不出现闪退的情况,时间会不会刷新,每个app的星级会不会正确显示,这些测试中唯独最后两项最为麻烦,第一次测试的时候星星的显示问题总是搞不定,不管怎么调试都是显示五颗星,和显示的数据不照应,经过同学的帮忙,忙才发祥是父视图没有对子视图进行切割,还有就是限免的价格是被拉掉的,我是用xib做的拉掉的效果,但是在点击这个app的时候这个被拉掉的线就会莫名的消失,变成原样,当时周围的同学也是每办法了,这个问题一直拖到了最后,知道有天逛博客时看到有一篇博客写到点击cell的时候,cell会变成灰色,当时我就想到了这个问题,我认为我的划线没了可能是和cell的背景色冲突了,把这个关掉之后,果不其然,划线不会消失了。

2.降价模块测试,主要针对数据解析json的正确应用,josn解析的时候主要注意里边数据的取值方式,json数据里边你需要的可能是有一个数组构成的,也可能是一个字典,正当的取值才不会造成无谓的越界现象,还有json数据中并不是所有的数据都是字符串的形势显示,也可能会出现NSnumber的数据,当时在后期调试的时候,我的程序就因一个NSNUmber的数据没有处理好,导致程序崩溃,还很难找,因为我就没想到我会在这里取值出错误。

3.免费模块测试,主要测试对数据的解析,以及内容的显示。

4.专题模块的测试,主要测试cell上的控件是不是能正确的传值,主要注意block在反向传值的时候的回调,以及对block的应用,专题模块这一点可以说的是我耗时最多的一个界面,主要就消耗在界面传值这一块,由于cell上的app比较多,对于如何处理我选中的是哪个app是我一度陷入盲区,不知道如何处理,首先想到的方法是取到app的父视图,但是运行的时候根本不行,知道后边学习了block才解决了这个问题。

5.详情页面的测试,主要测试是不是每个界面都能正确的传进来数据,以及对数据的展示,数据图片不一样多造成的越界现象,图片的加载相册功能,分享功能,收藏功能。对周边应用的具体详情再次查看,怎么进行数据的处理,详情页面在处理的时候,难点就在于怎么把本页的周边app再通过点击app在本页显

38

河南理工大学毕业设计(论文)说明书

示具体的信息,这个问题导致我把程序进行了大修改,烦躁啊,因为前期的逻辑没处理好,导致这里传值出问题,不过在我的努力下还是把程序都改了。

在完成逐个模块测试后,开始对系统进行验收测试,运行该系统,在运行过程中查找出现的错误。

5.2 功能整体测试

在安装好配置环境的电脑上测试,刚开始出现屏幕混乱,经过反复修改,现在已经能正常运行。用xcode上自动检测内存工具,检测出多处内存泄露问题,都已经修改。测试到这个阶段就简单多了,繁琐的工作都做完了,不过在这个阶段我还是发现了一个严重的问题,就是内存泄露,原因是我在cell中实例化了一个控件,我当时竟然天真的以为ARC不会有内存泄露,但是还是出现了,cell复用的时候,虽然使用的以前的cell,但是你在cell里边申请的控件还会一直开辟空间消耗内存,这样就会导致内存泄露。

39

河南理工大学毕业设计(论文)说明书

总结与展望

总结

经过一段时间的忙碌,终于把毕业设计的任务完成了。现在我对该系统做一下总结

本项目的开发目标,主要是为了提供iphone手机应用平台,为用户更好的体验iphone手机。设计经过紧张而有序的系统开发,收获颇丰,感触颇深。现在对经验收获、教训反思两大部分总结如下: 经验收获:

1.编写程序前,对已完成设计构思的系统进行主次分析,排好功能实现顺序,列出程序编、写步骤,对于理清编程思路很有帮助。人的逻辑思维可能很发达,在设计当中可以不用笔记,在脑中就能想好三到五个功能的逻辑关系和编写步骤。但以后我们面对的是一个庞大的系统,大系统下分多个子系统,子系统下分多个功能模块,功能模块下分多个功能页面,功能页面下分多个子功能,而且子系统、功能模块、功能页面、子功能之间的逻辑关系构成了一张复杂庞大的逻辑关系网。这就需要我们在原先做好的设计流程图上,系统规划,全面分析,逐步细化,反复斟酌、推敲,然后列出编程计划。

2.善于借鉴他人的成果,实现自己的功能,可以有效地缩短开发时间,提高工作效率,是快速提高编程能力的最佳途径。借鉴他人的劳动成果并不是简单地拷贝别人的源代码,如果只是这样的话,你会因为系统经常的报错,却束手无策,最后将其认为是鸡肋而抱怨连天。应该是先要分析读透他人的程序思想,取其精华,去其糟粕,使之成为自己的思想,然后将这些功能块与自己的功能块融合。

3.在完成这个课题的过程中,遇到了很多问题。对于iOS的开发过程更是头疼,因为在iOS中有些控件必须接收协议,而且不用手动调用协议中的方法,系统自己调用,比如:UITableView。这个让我感觉很不可思议,以至于每次非得手动调用协议,但是每次都出错,后来就记住这个问题了。

4.每编完一个功能,应及时与其它完成功能一起测试,运行无误后,方可进行下一步开发。这样做是为了在测试时如果出错能很方便地找到出错的环节和病因所在,我们称之为“step by step”(一步一脚印),对于一个初级的程序开发者来说是很有帮助的。对于编程人员来说每一个环节都是来不得有半点差错的,每一个功能都是环环相扣,相互关联,相互作用的

40

河南理工大学毕业设计(论文)说明书

教训反思: (1).学习与实践的结合不当。当我进行程序开发的时候,发现以前学习的知识点到用时却忘得一干二净了,也只好重新学习基本知识了。如果以前把知识学得透彻点,理解深刻点,也许在开发过程中可以缩短时间,提高效率。反思自我,归其原因:不是当时的学习不够认真,而是缺乏对知识点的运用实践;对于像我这样“半路出家”的编程人员来说,只是理解知识点是远远不够的,如果当时没有经过编译、运行、调试的过程,很快就会忘记的。

(2).学习目标不专一。我们都知道在学习的时候是最忌讳这个还没学明白就去学那个的,结果当然是哪个也没学明白。这个没学好,就想用另一个,造成学习不深入,学习效果不好。以后一点要记住此教训。

展望

这次毕业设计项目做得时间挺长的,从开始学习c语言,到后来的高级语言objective-c、UI、初级网络、高级网络等。到最后项目的结束,感觉自己学习到了很多知识,但是知道的越多你就会越发的感觉到自己知识的不足,第一次开始认认真真的学习c还是从图书馆里的《21天精通c语言》开始,是一门语言你就要记忆很多东西,我学习的时候觉得最难得不是逻辑而是记忆,到后来的objective-c,这门高级语言的底层是对c语言的封装,把c的很多逻辑封装成方法,你只需拿来用就ok了,oc学完的时候已经是年后了,之后学习了UI的界面搭建,以及初级网络。学完初级网络就着手写自己的毕业项目,当时觉得很难,很多知识都不熟悉,还有分享,block等高级网络的知识还没有接触到,因此在初期毕业项目制作过程中只完成了界面的加载数据,界面之间没有相互的跳转,很没有活力,基本的界面搭建完成已经过了一个多星期了,之后有做了bug调试,把出现的问题解决了,这样这个app才有了形,这个完成之后我就着手学习了高级网络,接触到了分享,支付,通信等知识,还学了block的界面传值,平时学习完都会做一些小的demo来做练习,大概一星期之后才回头来完善自己的毕业项目,这是的毕业项目也已不是当初的大难题了。

虽然毕业项目做完了,但是功能并不是那么完美,就像我刚开始接触这门语言时,我会觉得很难办,到我学的多了,见得多,用的多了,丰富的知识已经让我感觉到自己入门了,有自己的学习方法了,本来学习就是一个循循渐进的过程,我们每个人都不可能一下子做的很完美,很出色,都需要不断的完善。我也希望自己在以后的工作中得到更多的知识、经验。让自己不断地进步,做出属于自己 41

河南理工大学毕业设计(论文)说明书

的独特的作品。

42

河南理工大学毕业设计(论文)说明书

参考文献

[1] 谭克强Objective-C程序设计(第四版)。

[2] 51cto网站oc教学视频自学。以及对牛人博客的借鉴。 [3] 21天精通c语言,河南理工大学,图书馆。 [4] 博客园学习,主要学习UI时对我的帮助很大。

[5] cocoaChina第三方库的使用,对后期做毕业设计,提供很多便利。

[6] 个人觉得最好用的还是度娘,什么问题都可以问她,自学学到的东西才会理解的更 深刻。

[7] DaveMak(美)JackNutting(美)JeffLaMarche(美)著.杨越孙文磊等译.ios5基础 教程[M].北京:人民邮电出版社.2013:3 [8] MarkDalrymple(美)ScottKnaster(美)著.杨越等译.Objective-C基础教程[M].北 京:人民邮电出版社.2012:7 [9] StephenG.Kochan著.林翼、范俊、朱奕欣译.Objective-C程序设计(第四版)[M]。 北京:电子工业出版社,2012:12 [10] 虞斌著.Ios软件开发揭秘:iPhone&iPad企业应用和游戏开发[M].北京:电子出 版社,2011:1 [11] 克莱尔(美)著.李强译.Objective-C2.0Mac和ios开发实践指南[M].北京:机械 工业61出版社,2011:1 [12] BrianW.KernighanDeninisMRirchie著,徐宝文,李志(译)TheCProgramming Language[M].北京:机械工业出版社2003:2 [13] 徐松林,黄猛著.cocos2D-x手机游戏开发[M].北京:人民邮电出版社.[14] Ronpatton(美)著.王钰,曹跃译.软件测试[M].北京:机械工业出版社,2006 [15] 王水著.软件工程[M].河南:河南科学技术出版社,2008:8 [16] 吴洁明著.软件工程实例教程[M].北京:清华大学出版社,2010:11 43

河南理工大学毕业设计(论文)说明书

谢 辞

在本论文的写作过程中,我的导师宋成老师倾注了大量的心血,从选题到开题报告,从写作提纲,到一遍又一遍地指出每稿中的具体问题,严格把关,循循善诱,在此我表示衷心感谢,谢谢宋成老师在我撰写论文的过程中给与我的极大地帮助

同时我要感谢学院的各位老师、同学和朋友。在整个的论文写作中,各位老师、同学和朋友积极的帮助我查资料和提供有利于论文写作的建议和意见,在他们的帮助下,论文得以不断的完善,最终帮助我完整的写完了整个论文

另外,要感谢在大学期间所有传授我知识的老师,是你们的悉心教导使我有了良好的专业课知识 ,感谢这四年来计算机学院对我的栽培,使我成为了一名合格的理工学子。

44

第17篇:IOS课程设计

IOS课程设计

课程名称 图片处理器 班 级 移动一班 学 号 1215115032 姓 名 汪如胜 指导教师 韩 璞

目录

一、课程设计目的.................................错误!未定义书签。

二、课程设计内容.................................错误!未定义书签。

三、需求分析描述.................................错误!未定义书签。

四、系统设计.....................................5

五、总结和体会..................................6

六、系统实现过程.................................7

七、主要代码和程序清单..........................错误!未定义书签。

一、课程设计目的

本项目的目的是开发一款IOS的图片处理器,使手机显得更生动灵活化,提高手机的智能化的发展。为了让学生掌握面向过程程序设计的基本思路和方法,学会使用Objective-C语言的基本知识,独立解决简单的iOS应用程序设计问题,了解iPhone手机应用的开发步骤和基本方法,也使学生更加熟练ios的技术和在市场上的特点。

二、课程设计内容

图片处理器应该包含两个功能模块,分别为图片显示模块和图片操作模块。其中,图片显示模块,可以进行缩略图显示图片和全屏显示图片。图片操作模块,可以实现放大、缩小、旋转、剪裁和保存等功能。设计界面友好,完成开发文档。

三、需求分析描述

需求分析指的是在建立一个新的应用的时,就这个新的应用的目的、范围、定义及功能这些方面所要做的工作。需求分析是完成一个应用必不可少的部分。在进行一款项目开发的过程中,开

发者必须确定客户的需求,在确定了客户需求后才能进行应用的开发。根据当前社会形势,ios系统在中国逐渐流行,单单是iOS方面的图片浏览器已经具备了相当的规模。市场上的图片浏览器品牌繁多,定位不一,基本满足了各层次消费者的需求。最新的调查显示比较大的图片浏览器市场,并不是很乐观。而外形新颖、小巧轻便灵活的图片浏览器却很受年轻人的青睐和欢迎,市场发展前景广阔,具有很大的发展空间。因此,设计图片浏览器重点还是在于美观的外形和实用的性能,占用较小的内存,实现用户对于图片浏览器的需求,可以更好的吸引用户。

四、系统设计

1、程序设计图

2、功能模块

(1)图片显示模块

可以进行缩略图显示图片和全屏显示图片

1.图片处理器UI设计

@property (weak, nonatomic) IBOutlet UIButton *previousBtn; //上一张Button @property (weak, nonatomic) IBOutlet UIButton *nextBtn;

//下一张Button @property (weak, nonatomic) IBOutlet UILabel *noLabel;

//标题

@property (weak, nonatomic) IBOutlet UIImageView *iconView;

//用于图片显示

2.记录当前显示的是第几张图片 @implementation ViewController

-(void)viewDidLoad {

[super viewDidLoad];

self.index = -1;

[self next]; }

(2)图片操作模块

实现图片浏览上一张、下一张等功能

#pragma mark 上一张(IBAction)next {

//增加索引

self.index++;

//根据索引显示对应的内容

[self changeData]; }

五、总结和体会

在经过两个星期的课程设计后,基于iOS的图片处理器的功能得以实现。在设计期间,进一步了解到开发一款项目是一类非常复杂的工程。在开发之初就应该想好总体框架结构以及如何进行每一步的操作。开发者需要有清晰地逻辑思路并以科学的方法来开发应用。开发过程中要有清晰地设计思路,尽量简化设计,减少代码量,提高编程效率。同时通过这次的设计使自己更好地了解到在知识方面的不足,明确了今后需要努力的方向。在这次开发的过程中,虽然自己遇到了很多的困难,但在老师的帮助下最终解决了这些问题,在此感谢指导老师的精心指导,在完成这次课程设计的时候,感觉自己在知识方面、软件应用方面还有遇到问题独立解决问题方面都有了很大的进步,为ios的开发提供了宝贵的经验。对于ios的图片处理器的设计原理有了清晰的认识,对于软件的UI设计有了独特的见解,对知识的提高有了很大的帮助。

六、系统实现过程 定义两个Button

@interface ViewController ()(IBAction)next;

分别为上一张(previousBtn)、下一张(nextBtn)两个按钮,控制图片的浏览

使用index记录当前显示的是第几张图片 @implementation ViewController

-(void)viewDidLoad {

[super viewDidLoad];

self.index = -1;

[self next]; }

使用switch、case语句选择不同的图片,并显示对应的内容

#pragma mark -(void)changeData { switch (self.index) {

case 0:

self.noLabel.text = @\"1/5\";

self.iconView.image=[UIImageimageNamed:@\"biaoqiandi\"];

self.descLabel.text = @\"第1张图片\";

break;

…… }

self.previousBtn.enabled = (self.index !=0);

self.nextBtn.enabled = (self.index !=4); }

根据索引显示对应内容

#pragma mark(IBAction)previous;(IBAction)previous { //减少索引 self.index--; //改变数据

[self changeData]; } #pragma mark 下一张 - (IBAction)next { //增加索引 self.index++; //根据索引显示对应的内容 [self changeData];

} @end

第18篇:iOS教学大纲

iOS教学大纲

C语言

教学目标:让学生掌握基本的编程思想,语言结构和常用经典算法。使学生具有基本的编程素养和思维。能够用c语言描述各类经典过程,记录各种数据。为之后的应用开发打好基础。 1) C语法基础

a) 常量、变量类型、变量 b) 运算符:算术、关系、逻辑 c) 分支语句 d) 循环语句 e) 数组 f) 结构体 g) 指针 h) 函数

i) 经典排序、选择算法 j) 链表的概念和简单实现

Objective-C语言

教学目标:使学生熟练掌握OC语言特性和语法。系统训练学生面向对象编程思维,能够处理各种复杂问题。具有基本的处理复杂问题的解决能力。 1) OC语法基础

a) 类的声明与实现 i) 类声明的关键字 ii) 类实现关键字 b) 成员变量和方法

i) 成员变量访问权限 ii) 方法类型 iii) 方法名与参数

c) 对象指针的创建与分配内存 i) 内存分配,初始化 ii) 定制初始化过程过程 d) 属性机制 i) 属性作用 ii) 属性控制符 e) 点语法

i) 点语法规则 ii) 点语法使用 f) self关键字

i) 方法隐含参数 ii) self赋值过程 2) 继承与复合 a) 继承语法

b) 消息动态路由 c) super关键字 3) 字符串与集合 a) 字符串

i) 创建,复制 ii) 截取,分割 iii) 拼接 b) 数据结构 i) 概念

ii) 关系型数据 iii) 关系表现

c) 数组和字典的基本使用

d) 数组、字典和字符串的嵌套对数据的保存 e) JSON格式 4) 内存管理-ARC a) ARC原理

b) ARC关键字的作用 i) Strong ii) Weak iii) Autoreleasing iv) Unseft__unretian c) 强引用循环 i) 出现原因

(1) 相互强引用 (2) 间接强引用链 ii) 避免方法

(1) 使用weak打破强引用链

5) OC语言特性 a) 类目 b) 延展 c) 协议

d) KVO(键值观察)、KVC(键值编码) e) 单例模式 f) 通知中心 6) 模块化编程1 a) 模块

i) 模块概念 ii) 模块化结构 iii) 模块化开发 b) 目标-动作回调 i) id类型 ii) SEL类型

c) 委托模式回调 i) 回调方法规范 ii) 回调对象规范 7) 模块化编程2 a) Block i) 概念及用途 ii) 定义方法 b) Block回调 8) 模块化编程3 a) 复杂模块 b) 触发回调

i) 触发目标的动作 ii) 触发委托人方法 iii) 触发Block对象

iOS App开发基础(原UI基础)

教学目标:快速高效的学习和使用大量ios原生控件满足视图设计需求。能够定制控件满足特殊需求。能够独立完成app的开发工作。 1) App开发入门 a) 系统启动流程 i) 代码

ii) storyboard b) UIControl子类的使用 i) UIButton ii) … 2) 系统组件 a) UIView b) UIView常用子类 3) 视图布局 a) 绝对布局

i) 常用视图尺寸 ii) 位置计算规则 b) 相对布局

i) stroyboard设置约束 ii) 代码设置约束 c) 横竖屏变换

i) UIDevce获取设备信息 ii) UIScreem获取屏幕信息 d) 视图控制器关键时间点 i) viewDidLoad ii) view相关 iii) 视图朝向变换 4) 视图结构

a) 导航控制器

i) 根视图控制器 ii) push与pop iii) bar月item b) 页签控制器

i) 自定义tabbar c) 模态展示 d) 视图层次 5) 表视图

a) UITableView i) 数据源 ii) 委托回调 b) 表视图控制器 c) 静态cell d) 多样式cell 6) 数据持久化-CoreData a) CoreData的增删改查

b) NSFechedResultController的使用 c) 表视图的增删改 7) 网络编程

a) 后台文档的阅读 b) 创建请求 c) 创建连接 d) 解析数据

e) AFNetWork的使用 f) CocosPods的使用

8) 应用事件及状态,手势,绘图 a) 事件传递过程 b) 事件响应过程 c) 应用状态 d) 状态切换 9) 多线程

a) NSObject多线程方法 b) NSThred多线程 c) 队列与操作 d) GCD iOS App开发专题(原UI高级)

教学目标:针对市面上流行app的常用功能模块的开发实现。使学生具有多个项目的核心解决方案。 1) 表视图搜索

a) UISearchDisplayController的使用 b) UISearchBar的使用 c) CoreData谓词的使用 2) 新闻列表 a) 下拉刷新

b) 点击加载更多

3) 图文混排(文字表情实现) a) TextKit框架 b) 富文本的使用 c) 添加链接 4) 自定义键盘 a) 表情键盘 b) 功能键盘

c) 键盘切换与高度获取 5) 照片库

a) 选取图片与视频 b) 拍摄照片 c) 录制视频 6) 定位与位置服务

a) CoreLocation定位 b) 使用新浪位置服务 7) 音频录制播放

8) scrollView轮播与缩放 9) 常用第三方 a) 加密类 b) 指示类 c) 功能类

iOS App练习项目

教学目标:强化和练习学生处理问题的能力。 1.通讯录

a) 具有联系人增删改查功能 b) 首字母自动分组功能 c) 自定义头像功能 d) 表视图索引 e) 数据持久化 2.新浪微博

a) 微博的展示与发送

b) 展示有图片和无图片两类微博 c) 具有显示表情功能

d) 发微博可以发送表情和照片 e) 可以转发和收藏微博

f) 点击微博图片可以放大显示 3.Meage a) 使用xmpp通信协议进行即时通信 b) 高仿微信聊天界面与功能

iOS 上线APP 真实项目,完整开发上架流程。

云计算专题

教学目标:使学生可以在云平台上搭建数据服务后台,对app进行联网数据支持。

1.云平台使用

a) SAE,新浪 b) BAE,百度 c) ECS,阿里云 2.云储存使用

a) Storage,新浪 b) 七牛

c) OSS,阿里 3.PHP脚本

4.MySQL数据库

第19篇:IOS设计规范

刚入门UI的小伙伴是不是不知道app该怎么切图、规范是什么?怎么和程序员同学配合,用什么工具更方便,怎么标注自己的设计稿,怎么做到一稿适配多种机型,这篇文章将一一解答你的疑问!

依旧声明:这里写的不是一种规范,只是一种工作方法,大家在具体工作中,一定要灵活运用。另外,技术的更新是非常快的,所以,还是要灵活运用~

我本身是一名GUI设计师,所以我只站在GUI设计师的角度去把APP从项目启动到切片输出的过程写一写,相当于工作流程的介绍吧;公司不同,流程不尽相同,但是终究还是能有些帮助。

这里我们只说IOS系统下的设计,至于Android,因为尺寸太多,涉及的东西比较乱,我整理好以后再说吧。

页面篇幅比较长,不推荐一次性看完,那样你潜意识里就会对它厌烦了,所以可以有时间读一读,看一看。

Part 1 项目立项

完善的公司会把项目相关人员聚集起来,产品经理会把产品详细的用原型展示出来,包括产品定位,市场需求,主打卖点,产品性质以及各模块具体功能,逻辑跳转演示一下;之后会评估项目用时,各部门协调,项目启动。

话不多说,接到原型,那我们应该做什么准备工作呢?

在项目设计之初,就该进行项目归档整理,我的习惯是“项目名称+版本序列”; 没有最正确的工作方法,只有最适合自己的工作习惯。

我个人习惯把不同类型的文件划分到不同类型的文件夹里,有的设计师习惯全都放在一个文件夹里,如果文件少还说的过去,如果页面过多,就知道这样的利弊了。

工欲善其事必先利其器,基本上我做界面设计用的最多的就是PS和AI了,版本无所谓,用着舒服就行,推荐版本高一点的,低版本好多方便功能都没有。

标注工具:

PxCook,目前我还没用上Mac,所以也不知道传说中的Sketch到底多神奇。PxCook在Windows上标注还比较顺手,虽然它还附带切图功能,但是比较鸡肋,不推荐用它切图。

切图工具:

Cutterman 点击下载一款PS的插件,切图非常方便,但不支持绿色免安装版本PS,而且对PS版本要求比较高,针对CS 6的已经不维护更新了。推荐安装官方完整版PS cc,然后自行破解。官网上有安装使用教程,自己研究下吧,因为我也是最近才开始接触这款插件。

Aistor PS 也是一款PS的切图标注插件,也被誉为神器;我使用了下,感觉相当不错,就是标注还没太适应,推荐一下这个。

标注工具以及这两款插件我都会上传,至于安装方法去“百度一下”吧,易学易用。 Part 2 Photoshop设计尺寸

现在常用的几种设计尺寸

1. 640*960

4时代的尺寸,刚接触APP设计用的是这个尺寸,拟物盛行的时代(现在用这个尺寸设计的应该比较少了吧);

2. 640*1136 5/5S/5C,IPhone更新,咱们设计也得跟着与时俱进(应该还有人用这个设计尺寸),进入扁平的时代了;

3.750*1334 6 目前我做设计稿的设计尺寸,IPhone6的尺寸,向下可以适配4,5,向上可以适配6 plus;我记得IP6推出后,我问总监应该用什么尺寸设计,他说用IP6的吧,好适配,切出来就是@2x了,改一改上下都能照顾到。

推荐做设计稿的时候使用IPhone6的尺寸进行设计。

IP 6的尺寸相比于IP 5来说,很多系统控件尺寸并未变化,只是高度也就是内容显示区域发生了变化。下面是IPhone 6的空白文档,我建立了参考线。

文档建立之初就设置好参考线是个很好的工作习惯,我希望更多的设计师可以养成更好的工作习惯。

上下的参考线很容易设置,因为是根据IPhone自身系统设置的,左右的参考线我习惯设置为24px,也就是显示内容距离边框的距离。这不是绝对的,我和总监研究过,究竟是设置为左右30px还是24px比较好,通过对国内国外各种APP的对比,觉得24px更适合一些,不宽不窄,这个完全是设计师个人的设计习惯,所以不要当成什么规范,确切的说,整个屏幕你都可以随便做,但是我们这里说的是正常页面。

Part 3 页面标注

标注是重中之重,工程师能不能完整的还原设计稿,很大一部分取决于标注;如果不清楚你该怎么标,一定要和工程师沟通!

每个工程师实现效果的方法不同,我在这里所说的,是我的标注习惯,但应该适用于大部分的设计师和工程师。

不需要每一张效果图都进行标注,你标注的页面能保证工程师开发每个页面的时候都能顺利进行即可;

这里的标注软件使用的是PxCook,先标一个空白文档,看看都需要什么吧

这里要说一句,PxCook虽然可以自动读取颜色,但是还不能对PSD文档里设置的透明度读取,所以如果你用了透明色,推荐你用文字标注直接写出来原色值以及透明度。 基本上我并不使用PXCook里面的颜色标注工具,而是使用文字标注工具,因为要标识两种色值,PxCook只能显示一种色值。

一般我的习惯是PS和标注软件同时打开,因为有时候标注软件并不能完全的把PSD文件里的东西标注出来,所以标注也要灵活运用,如果无法标注,就到PS里查看一下,然后再使用文字标注说明一下。

标注颜色是使用16进制,还是RGB:

都用得到,要看实现什么东西,建议标注颜色时,两种色值表达都标上(16进制&RGB)。 你需要标注的内容有:

1.文字需要提供:字体大小(px),字体颜色;2.顶部标题栏的背景色值,透明度;

3.标题栏下方以及Tab bar上方其实有一条分割线,需要提供色值; 4.内容显示区域的背景色(如果是全部页面白色,那就和工程师说一句就行); 5.底部Tab bar的背景色值。

因为页面的种类成千上万,我想每种页面都讲一下,但是不现实,希望可以举一反三。 下面的是一个比较普通的首页页面,但是基本上一款APP中应该标的元素都有了~

一般页面你需要标注这些地方:

所有元素统一距离屏幕最左24px(全局性的数据可以直接和工程师沟通,也可以标注,推荐标注出来)

1.标题栏:背景色,标题栏文字大小,文字颜色(不再赘述);

2.Banner:所有撑满横屏的大图,不需要横向尺寸,把高度标出了就可以了;3.菜单图标:

图标的大小和图标的可点击区域不一定一致

也就是说,图标可以做的很小,但是为了保证点击的准确性和流畅性,工程师可以把可点击区域设置的很大,这样标注和切图的时候就要注意,标注的是可点击区域的大小,切图切的也是可点击区域的大小,也就是用透明区域去补上,否则图片会模糊。 在设计的时候就要考虑可点击区域的范围,比如X宝购物车页面左侧的小圈,可点击区域要比实际小圈尺寸大很多。

这种类型的图标需要标注图标点击区域大小,图标距离屏幕最左最右以及上下的距离。至于图标的间距,因为有些时候可能

设计师不能完全做到1px不差,所以我基本不标,交给工程师让他们去处理,其实等距排列的图标不需要标间距,因为工程师还要动态适应不同的屏幕,标了间距也是白标(还是要和你的搭档沟通怎么去标注);

4.模块间隔:这个位置其实不是太重要,我习惯标注上这里,麻烦能少则少。5.图片+文字:这个应该比较常见,只标注一个单位(图+文)就可以了。

图片需要标注宽高,因为工程师要设置图片区域,从后台调取,可以这么说,软件里除了横屏撑满的图,基本上所有的图片都要标注宽高。

图片距离上下左右的距离,文字大小颜色,这里的文字其实算两个控件,标题文字以及说明文字,需要单独标出。

Tab Bar:

这个位置其实比较特殊,你可以单独标注图标大小+文字大小;还可以图标文字算作一个控件,整个切出来;

我们工程师的习惯是用整个的,也就是图标+文字算作一个ICON,所以我基本不怎么标注单独的图标(这里可以和你的搭档去沟通一下,看他是什么开发习惯)。 关于列表页类型的标注问题

普通的列表有两种方法(去问你的搭档,他喜欢用什么方法): 1.标出行高,行内元素居中;

2.标出行内元素,元素上下间距,确定行高;每种元素的位置如何确定:

通常标注的都是元素距离屏幕最左侧的距离,比如上图的图标元素距离左侧24px,文字元素距离左侧100px。

标注这个东西没有固定的方法,工程师的开发习惯不同,标注方法也不同。

该怎么标注虽然可以在网上找到方法,但那不一定适合你,一定和自己的搭档勤沟通,方法是死的,人是活的……

所有的页面标注总结起来就是:标文字,标图片,标间距,标区域;

(上述图标出现了45px的单数,因为软件自动吸附上去了显示了图标本身的尺寸,切图的时候记得输出个偶数尺寸的切片)

Part 4 切片资源的输出

切之前务必要和你的工程师搭档沟通一下,该如何去切才能配合他的开发。

全局性的切图常见问题

你的所有设计尺寸,包括图形效果,应该尽量使用偶数。

技术开发使用的尺寸是设计稿像素尺寸的一半,也就是说,如果你用24px的字体,技术那边就是设置为12px;

所以标注的时候务必使用偶数,为了保证最佳的设计效果,避免出现0.5像素的虚边。 ②

切图尺寸应该提供几套?

ico_car.png

IPhone2G,3G,3GS使用(好像没人用这手机了吧) ico_car@2x.png

IPhone4,5,6优先加载此尺寸图片(不是必须使用这个尺寸,是优先加载调用这个尺寸) ico_car@3x.png IPhone6 plus使用的尺寸

可以简单的理解为倍数关系(其实是为了满足不同分辨率,我觉得不用过于深究),如果你使用IPhone 6尺寸做设计稿,那么切片输出就是@2x,缩小2倍就是@1x,扩大1.5倍就是@3x了。

理论上,为了达到最好的视觉效果,你应该输出三套尺寸,推荐输出三种尺寸的切片资源。 我的工程师搭档要求我给两套尺寸就可以,也就是@1x @2x的两种尺寸,因为我们没有6 plus的测试机,所以看不到效果,据他说应该不会太失真,但是为了保证效果,我还是给三套尺寸。

另外现在几乎看不到3GS了,所以需不需要提供一倍图,还是要和工程师讨论一下~ @1x @2x @3x是开发工具Xcode软件需要的UI资源,命好名称后,IOS设备会自动的选取合适尺寸。

③共用资源的图片,输出一张就可以

类似这种重复的按钮之类的,只要提供一张共用的资源就可以了;上面的文字是技术写上去的。

理论上按照最佳视觉效果,你应该提供多尺寸的图片;但通常我只提供最大尺寸的一张图片即可,这一点要和你的搭档沟通好,却问他需要什么方式。

④切片的输出格式

文件→存储为Web所用格式

位图格式:PNG 24,PNG 8,JPG

在JPG和PNG两种格式图片大小相差不是很大的情况下,推荐使用PNG;如果图片大小相差很大,使用JPG。

欢迎页面,ICON一定要使用PNG格式,在不影响视觉效果的前提下,可以考虑使用PNG 8;

矢量图格式:PDF,SVG

IOS原生支持的两种矢量图片格式,但是支持的一般,并不能保证100%把所有图片效果渲染出来;

为了保险起见,我通常不使用这两种格式,推荐还是使用位图,如果以后技术提升,100%支持SVG和PDF这种矢量格式图,那个时候也许不用提供这么多套尺寸了~ ⑤图标的点击区域

最小点击区域问题:

IOS人机指导手册里推荐的最小可点击元素的尺寸是44*44 point(点),在设备上1 point等于1像素,所以转换成像素就是44*44像素,换算成物理尺寸大概是7mm左右吧(人机工效学研究中得出的结论:用食指操作,触击范围在7mm左右合适;用拇指操作,范围在9mm左右合适)。据说这个尺寸下,不容易出现误操作,误点击;小于这个尺寸,点击就会变的有些不太准确,一向注重用户体验的苹果公司定义这个最小点击尺寸也不是没根据的……

所以现在做设计,为了图标精致,你可以把图标做的小一些,但是切图输出的时候,要考虑用户点击难易度的问题,所以,切图的时候,涉及到需要点击的小图标的时候,普通屏幕还是切44px大小,高清屏就需要切88px,不够的地方用透明区域补全,否则用户点击的时候会比较困难,会很不灵敏。 ⑥图片图标的不同状态

每种图标或者图片如果有不同状态,每一种不同的状态都需要进行切片输出。

比如按钮有正常(normal),按下(preed),选中(selected),禁用(disabled)等多种状态, 最常出现的就是normal→preed→normal;某些特定按钮控件会出现选中状态,具体情况具体分析吧。这里显示的是你要知道按钮可能有几种状态……

切片的命名规则

命名并不是统一的规范,不同的公司不同的工程师有着自己不同的命名规范和命名习惯,但是大致还是有迹可循的,一般是:

切片种类+功能+图片描述(可有可无)+状态.png 名称应使用英文命名(中文不识别,推荐小写字母),不要以数字或者符号当作开头,使用下划线进行连接。

举个例子:一个首页的处于正常状态的确定按钮 btn_sure_nor.png btn_sure_nor@2x.png 切片种类是按钮(btn);功能是确定(sure);状态是normal(正常) 我通常是以这种命名方式进行命名,如果你的公司有设计文档,去看看之前留下的命名规范,如果没有,那就去问工程师吧。

Tab bar(底部栏)

说说Tab bar这里,因为比较特殊。

如果单纯的只有图标,自然是只切图标就好了; 早上和工程师沟通,这里该怎么切,工程师给的建议是 图标+文字的模式,图标最好单独切,文字后面程序加上去。

另外记住,同一模块的图标切片大小保持一致,上图的四个图标本身尺寸并不相同,但是切图的时候你需要切出相同尺寸的阴影大小,便于工程师开发使用。 该怎么切图,还是要和你的工程师搭档去沟通一下;

以下是常用命名,这是我的命名习惯,并不是规范,所以要灵活,如果实在不知道英文,就用拼音代替也行。

Part 5 工作常用数据

你需要使用的字体:

如果是用Mac设计的小伙伴,直接就用苹果黑体字就好了;不过用Windows的就没那么幸运了,PC上还没和IPhone默认字体效果完全一样的字体,通常都是拿其他字体代替。 苹果丽黑

Hiragino Sans GB W3(普通)/W6(粗体)

比较接近IPhone字体的一款字体,这是我之前一直使用的设计字体。

黑体-简

STHeitiSC-Light

Mac里面拷出来的苹果黑体,比较贴近IPhone手机字体,目前在用。

我会把这两款字体上传,有需要可以下载。

关于字体大小的问题

顶部操作栏文字大小

34-38px 标题文字大小

28-34px 正文文字大小

26-30px 辅助性文字大小

20-24px Tab bar文字大小

20px 文字大小只是一个范围,这要根据设计的视觉效果来决定,不要死记硬背,但是切记,字体大小要用偶数。

你需要知道的IPhone设计尺寸(这里是一个整屏的尺寸包括了状态栏) 320*480

IPhone3GS (我没见过3GS实体机,只在网上见过图片,但你需要知道这个尺寸) 640*960

IPhone 4/4s (4时代的设计尺寸) 640*1136

IPhone 5/5s/5c (5时代的设计尺寸,虽然现在出来6/6 plus,但还有人再用这个尺寸设计)

750*1334

IPhone 6 (目前最新的设计尺寸,基本上现在做IOS的APP设计,用这个的应该最多) 1242*2208

IPhone6 plus (这是标准分辨率,也就是设计需要的尺寸;另外还存在物理分辨率是1080*1920,这并不需要深入理解。plus还涉及到横屏,横屏是是没有状态栏的,设计横屏时可以参考IPad的设计模式)

你需要提交的启动页面

这是开发工具Xcode提供的LaunchImage(启动页面)的各项尺寸,不过好像现在已经改了,这还是工程师很久之前给我的,咋一看是不是吓一跳?工程师是按照IOS的系统版本来设置的,但你是设计师,你是按照IPhone的版本来作图的,所以其实没有那么多,真实情况下,我们的工程师要求提供以下几个尺寸: 640*960 (4/4s) 640*1136 (5/5s/5c) 750*1334 (6) 1242*2208 (6 plus)

2208*1242 (6 plus的横屏尺寸,如果你们的软件支持横屏模式,你就需要做一张横屏的启动页面) 注意,启动页面一定要是PNG格式的

图标的提交尺寸

IOS系统可以自动把图片裁剪为圆角,所以提交图标的时候,你只需要提交正方形的PNG图片即可。

因为需要的图标非常多,不可能全部加进去,只能选择最好的尺寸,我们的工程师要求我提供以下图标尺寸:

1024*1024

Retina APP Icon for APP Store(高清屏的APP Store) 512*512

APP Icon for APP Store(普通屏幕的APP Store) 120*120

6的主屏幕尺寸

114*114

5/4s/4的主屏幕图标尺寸 57*57

3GS的主屏幕图标尺寸 58*58

Retina Settings图标尺寸 29*29

Settings图标尺寸

提交的图标尺寸不是固定的,所以,去找和你搭档的工程师,让他给你出一份需要提交的图标尺寸文档。

差不多用的到的就这些,有时间可以去查看一下苹果的IOS人机指导手册或者开发文档,上面有更加详细的数据说明。

但实际工作中需要的并不像手册上提供的尺寸那么多,所以工作之中,和你的工程师搭档去沟通,你要知道的是你们公司开发所用的数据,而不是苹果提供给你的数据。

本篇是之前五篇的汇总,保留的基本全是工作需要的东西,至于更多的感想以及我对设计现状的思考,以及一些下载素材,可以去看看其余的五篇文字以及番外,对你应该有些许帮助吧。

第20篇:转正工作总结程序员

1前期工作回顾s0100

来到一个新的工作环境,最能发现自身的不足,这几个月,抱着虚心学习的态度,学习公司的开发流程,熟悉公司的企业文化,了解公司产品框架,主要技术,主动和同事沟通、学习经验,希望能更快的融入公司、融入开发团队,能够全心的投入工作。试用期期间完成的工作还十分有限,简单列了一些,公司领导批评指正:

熟悉公司开发流程,熟悉wps产品框架,主要是Shell部分,只是这一阶段的主要任务,贯穿始终

制作Unicode代码扫描工具

熟悉Shell部分现有的Unicode解决方案,熟悉Tnt的实现

解决Delphi对异常处理的缺陷

制作Unicode版本的ShellComboBox控件,一个通过调用ShellApI实现类似微软提供的用来选择文件夹的下拉列表框

负责跟踪WppShell部分的Bug

分析Shell部分影响启动速度的瓶颈

部分工作详细描述

制作Unicode代码扫描工具,语法扫描实现老梁已做好,我主要是调用他提供的ApI做成可视化的工具,第一版本做成独立的exe工具,第二个版本做成集成到DelphiIDE中的插件,与Delphi编辑器高度集成,主要要做到在Delphi编辑过的文件能立即被扫描,被扫描过的文件能够立即反映到编辑器中,即要获得Delphi的编辑器缓存,做到和编辑器同步。要能够将扫描的结果信息显示到DelphiIDE的消息列表框中,并可以像编译器生成的调试信息一样,双击信息自动定位到对应的源代码行。

操作系统和编译器共同协作建立起程序的异常框架,当程序运行到包含错的代码时,系统自动跳转到程序指定的错误处理程序,通过调用ApI,可以获得出错现场的CUp状态和堆栈信息,但邵高扬在内核试图使用ApIDump出出错的堆栈信息时失败,初步分析问题出现在Delphi部分,应为完全用C++写的测试程序可以获得错误信息,但通过Delphi写代码调用C++的Dll是,获取错误信息就失败。为此把Delphi内核与异常相关源代码又重新研究了一遍,分析对比Delphi和C++生成的异常框架汇编代码,找出原因。具体原因就不详写了,有相关开发文档。

返回目录

2感受公司文化

以前同学在还在公司的时候,经常能从她那里听到关于金山和她同事们的趣闻轶事,心里在想金山的文化氛围不错,那时偶然的一次,跑到她们公司去看她,在公司总部逗留过几分钟时间,就这短短几分钟给我留下了深刻的印象,也促使我后来又一次面临工作抉择时选择了金山

整个大大的办公室到处散播着朝气、自由、和谐的气氛,墙上显眼的地方挂着极富程序员特色的横幅,过道的白板上写着几月几号提交版本,几月几号几点几分到几点几分文字组预定会议室,仅仅一瞥就让我觉得这是一个重视工作效率和沟通方式的公司,办公室的一角贴着“小卖部”,桌上堆放着一堆年轻人喜欢的零食,小细节反映大文化,当时就和同学开玩笑,“问问你们老大还要像我这样的不”,如果有机会,我会选择金山

来到公司,感受到的公司文化.

3发现不足,展望未来

缺点,第一大缺点,有点不好意思提,被章庆元多次批评过,上班迟到,这个没有理由可找,努力反省改正,过年已经改进很多,能准时上班,踩单车的速度也因此提高了不少,同事也锻炼了身体,呵呵,一举多得。

言归正传,过年在家,认真地思考了这几个月的工作,觉得到公司以后我身上最大的问题是贪功心切,空浮,不实在,总是想做大问题,高难度的工作,不愿意做太过细节的简单工作,这个问题也被章庆元指出过。今年上班以后,调整好心态,开始静下心来,踏踏实实做些事情。

ios程序员工作总结
《ios程序员工作总结.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
相关专题
点击下载本文文档