ios开发目录结构
『壹』 如何将网站的目录结构拷贝到ios安装包内
看看这本书中的介绍iOS 6 Programming Cookbook下载地址: http://l4.yunpan.cn/lk/QvEEpQtRg5zAW如下章节内容(page83):1.26 Creating BundlesProblemYou want to group your resources into hierarchical structures and be able to accessthose resources at runtime with ease.Solution1.27 Loading Data from the Main BundleProblemYou have added a resource (such as an image) to your Xcode project and now, atruntime, you would like to access that resource.1.28 Loading Data from Other BundlesProblemYou have included a few images or other resources in a separate bundle inside yourmain bundle and you would like to access those resources at runtime.
『贰』 IOS应用项目的类及包结构是什么样的
Classes一般用来放置类,.h是;类的头文件(定义文件),.m是类的实现文件
Resources是资源文件,用来存放图片,音视频,已经工程信息(.plist那个),还有就是xib文件(view管理)
Framework顾名思义就是各种框架了,默认给出了三个框架,需要添加新的框架时新增的框架会存放到这里
『叁』 请问在ipad的目录结构中,Media下PhotoData和DCIM文件夹在功能上有什么区别呢
PhotoData文件夹在iPad中的作用,是储存应用内的图片数据。大部分的应用都会将其储存的图片文件暂时存档在该文件夹中。如果用户将iPad连接到了电脑并打开这个文件夹,则可以看见很多应用储存的图片文件。
而DCIM文件夹的作用是储存用户拍摄的照片。用户通过摄像头拍摄的所有照片,默认都存放在DCIM文件夹下,但是这并不意味着DCIM文件夹下的所有照片都是用户拍摄的。
因此,两个文件夹主要的不同在于其存放的文件来源不同,作用也不同。
『肆』 iOS 的沙盒目录结构是怎样的
NSString *home = NSHomeDirectory();//获取沙盒路径
//拼接Documents路径
//NSString *docPath = [home stringByAppendingStringt:@"/Documents"];
NSString *docPath = [home :@"Documents"];
NSString *filePath = [docPath :@"data.plist"];
NSArray *array = @[@1,@2,@"123"];
//具备writeToFile象才能使用plist存储NSArray
[array writeToFile:filePath atomically:YES];
主要获取路径文件写路径
『伍』 ios xcassets文件怎么创建
第一个iOS程序
首先打开Xcode—Create a new Xcode project—Single View Application--输入项目名称,同时选择使用Objective-C语言,设备选择iPhone--接下来系统默认生成一个IOS项目模板。项目目录结构如下:
firstios
此时什么也不用做,直接运行看一下(注意这里已经切换模拟器为iPhone5),没错我们看到了一个iOS应用程序:
firstIOS-iPhone5
程序的运行过程
在几乎所有的程序开发中程序一般都是从main函数开始运行的,那么IOS程序也不例外,在上图中我们可以看到Xcode为我们生成了一个main.m文件:
//
// main.m
// FirstIOS
//
// Created by Kenshin Cui on 14-2-23.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
这个默认的iOS程序就是从main函数开始执行的,但是在main函数中我们其实只能看到一个方法,这个方法内部是一个消息循环(相当于一个死循环),因此运行到这个方法UIApplicationMain之后程序不会自动退出,而只有当用户手动关闭程序这个循环才结束。这个方法有四个参数:
第一个参数和第二个参数其实就是main函数的参数,分别代表:参数个数、参数内容;
第三个参数代表UIApplication类(或子类)字符串,这个参数默认为nil则代表默认为UIApplication类,用户可以自定义一个类继承于这个类;如果为nil则等价于NSStringFromClass([UIApplication class]),大家可以自己试验,效果完全一样;UIApplication是单例模式,一个应用程序只有一个UIApplication对象或子对象;
第四个参数是UIApplication的代理类字符串,默认生成的是AppDelegate类,这个类主要用于监听整个应用程序生命周期的各个事件(其实类似于之前我们文章中提到的事件监听代理),当UIApplication运行过程中引发了某个事件之后会调用代理中对应的方法;
小技巧:
其实在Xcode中如果要看一些系统方法的解释或者参数说明,可以直接鼠标放到这个方法上,在Xcode右侧面板中就会给出帮助提示,如下图当我们放到UIApplicationMain上之后:
quickHelp
也就是说当执行UIApplicationMain方法后这个方法会根据第三个参数创建对应的UIApplication对象,这个对象会根据第四个参数AppDelegate创建并指定此对象为UIApplication的代理;同时UIApplication会开启一个消息循环不断监听应用程序的各个活动,当应用程序生命周期发生改变UIApplication就会调用代理对应的方法。
既然应用程序UIApplication是通过代理和外部交互的,那么我们就有必要清楚AppDelegate的操作细节,下面是UIApplication详细的代码:
AppDelegate.h
//
// AppDelegate.h
//
//
// Created by Kenshin Cui on 14-2-23.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
AppDelegate.m
//
// AppDelegate.m
//
//
// Created by Kenshin Cui on 14-2-23.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//
#import "AppDelegate.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application
{
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
- (void):(UIApplication *)application
{
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
- (void)applicationWillTerminate:(UIApplication *)application
{
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
@end
这个类中定义了应用程序生命周期中各个事件的执行方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;程序启动之后执行,只有在第一次程序启动后才执行,以后不再执行;
- (void)applicationWillResignActive:(UIApplication *)application;程序将要被激活时(获得焦点)执行,程序激活用户才能操作;
- (void)applicationDidEnterBackground:(UIApplication *)application;程序进入后台后执行,注意进入后台时会先失去焦点再进入后台;
- (void):(UIApplication *)application;程序将要进入前台时执行;
- (void)applicationDidBecomeActive:(UIApplication *)application;程序被激活(获得焦点)后执行,注意程序被激活时会先进入前台再被激活;
- (void)applicationWillTerminate:(UIApplication *)application;程序在终止时执行,包括正常终止或异常终止,例如说一个应用程序在后太运行(例如音乐播放软件、社交软件等)占用太多内存这时会意外终止调用此方法;
为了演示程序的生命周期,不妨在每个事件中都输出一段内容,简单调整上面的代码:
AppDelegate.m
//
// AppDelegate.m
// FirstIOS
//
// Created by Kenshin Cui on 14-2-23.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//
#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
『陆』 iOS 9更改了应用目录结构,电脑端不能再备份应用了,也不能访问应用内部数据,那是不是就意味着电脑
需要完美越狱。完美越狱后,安装合适的插件,能直接访问ios的任何目录和文件。
『柒』 iOS开发进阶的目录
推荐序. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii
第1 章引言. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 我为什么要写本书1
1.1.1 我的构思1
1.1.2 内容导读1
1.1.3 目标读者2
1.1.4 随书示例代码和勘误2
1.1.5 致谢2
1.2 如何提高iOS 开发技能3
1.2.1 阅读博客3
1.2.2 读书3
1.2.3 看WWDC 视频4
1.2.4 看苹果的官方文档4
1.2.5 看开源项目的代码4
1.2.6 多写代码,多思考4
1.2.7 多和同行交流5
1.2.8 分享5
I 第一部分:iOS 开发工具
第2 章使用CocoaPods 做依赖管理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1 CocoaPods 简介9
2.2 CocoaPods 的安装和使用10
2.2.1 CocoaPods 的安装10
2.2.2 使用CocoaPods 的镜像索引10
2.2.3 使用CocoaPods 11
2.2.4 查找第三方库11
2.3 注意事项12
2.3.1 关于.gitignore 12
2.3.2 为自己的项目创建podspec 文件12
2.3.3 使用私有的pods 12
2.3.4 不更新podspec 12
2.3.5 生成第三方库的帮助文档13
2.3.6 原理13
第3 章网络封包分析工具Charles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.1 Charles 简介15
3.2 Charles 的安装和使用16
3.2.1 安装Charles 16
3.2.2 安装SSL 证书16
3.2.3 将Charles 设置成系统代理17
3.2.4 Charles 主界面介绍18
3.2.5 过滤网络请求18
3.3 使用Charles 协助iOS 开发19
3.3.1 截取iPhone 上的网络封包19
3.3.2 模拟慢速网络21
3.4 高级功能22
3.4.1 截取SSL 信息22
3.4.2 修改网络请求内容23
3.4.3 修改服务器返回内容25
3.5 Map 功能25
3.6 Rewrite 功能27
3.7 Breakpoints 功能29
3.8 总结30
3.9 参考链接30
第4 章界面调试工具Reveal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1 Reveal 简介31
4.2 Reveal 的使用32
4.2.1 用Reveal 连接模拟器调试32
4.2.2 用Reveal 连接真机调试34
4.2.3 用Reveal 调试其他应用界面34
4.2.4 总结35
4.2.5 参考资料36
第5 章移动统计工具Flurry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.1 Flurry 简介37
5.2 Flurry 的基本使用38
5.2.1 注册和下载对应SDK 38
5.2.2 集成SDK 40
5.2.3 自定义统计项42
5.2.4 查看统计结果43
5.2.5 统计Crashlog 44
5.3 对比和总结45
5.3.1 和其他统计分析平台的对比45
5.3.2 总结45
第6 章崩溃日志记录工具Crashlytics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6.1 Crashlytics 简介47
6.2 Crashlytics 的使用49
6.3 实现原理和使用体会52
第7 章App Store 统计工具App Annie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
7.1 App Annie 简介55
7.2 App Annie 的使用56
7.3 App Annie 账号的注册及配置59
7.4 和其他工具的对比60
7.4.1 官方的命令行工具60
7.4.2 其他类似服务61
7.4.3 功能对比61
第8 章Xcode 插件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
8.1 Xcode 插件管理工具Alcatraz 63
8.1.1 简介63
8.1.2 安装和删除64
8.1.3 使用64
8.1.4 插件路径66
8.2 关于Xcode 的插件机制66
8.3 常用Xcode 插件66
8.3.1 KSImageNamed 66
8.3.2 XVim 67
8.3.3 FuzzyAutocompletePlugin 67
8.3.4 XToDo 67
8.3.5 BBUDebuggerTuckAway 68
8.3.6 SCXcodeSwitchExpander 68
8.3.7 deriveddata-exterminator 68
8.3.8 VVDocumenter 69
8.3.9 ClangFormat 69
8.3.10 ColorSense 69
8.3.11 XcodeBoost 70
第9 章其他工具介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
9.1 取色工具:数码测色计(DigitalColor Meter) 71
9.1.1 前言71
9.1.2 使用介绍71
9.1.3 其他类似工具:xScope 72
9.2 其他图形工具73
9.2.1 ImageOptim 73
9.2.2 马克鳗74
9.2.3 Dash 74
9.2.4 蒲公英75
9.3 命令行工具75
9.3.1 nomad 75
9.3.2 xctool 76
9.3.3 appledoc 76
II 第二部分:iOS 开发实践
第10 章理解内存管理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
10.1 引用计数81
10.1.1 什么是引用计数,原理是什么81
10.1.2 我们为什么需要引用计数83
10.1.3 不要向已经释放的对象发送消息85
10.1.4 循环引用(reference cycles)问题85
10.1.5 使用Xcode 检测循环引用88
10.2 使用ARC 90
10.2.1 Automatic Reference Count 90
10.2.2 Core Foundation 对象的内存管理92
第11 章掌握GCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
11.1 GCD 简介95
11.2 使用GCD 97
11.2.1 block 的定义97
11.2.2 系统提供的dispatch 方法98
11.2.3 修改block 之外的变量99
11.2.4 后台运行99
11.2.5 总结100
第12 章使用UIWindow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
12.1 UIWindow 简介101
12.2 为UIWindow 增加UIView 102
12.3 系统对UIWindow 的使用102
12.3.1 WindowLevel 104
12.3.2 手工创建UIWindow 105
12.3.3 不要滥用UIWindow 108
12.3.4 参考资料109
第13 章动态下载系统提供的多种中文字体. . . . . . . . . . . . . . . . . . . . . . . . . 111
13.1 功能简介111
13.1.1 前言111
13.1.2 功能介绍112
13.1.3 字体列表112
13.2 使用教程113
13.2.1 相关API 介绍113
13.2.2 总结115
第14 章使用应用内支付. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
14.1 后台设置117
14.2 iOS 端开发119
14.3 服务端开发121
14.4 注意事项122
第15 章基于UIWebView 的混合编程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
15.1 混合编程简介123
15.2 使用模板引擎渲染HTML 界面124
15.3 Objective-C 语言和JavaScript 语言相互调用126
15.4 如何传递参数129
15.5 同步和异步129
15.6 注意事项130
15.6.1 线程阻塞问题130
15.6.2 主线程的问题130
15.6.3 键盘控制130
15.6.4 CommonJS 规范130
15.7 使用Safari 进行调试131
第16 章安全性问题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
16.1 前言135
16.2 网络安全135
16.2.1 安全地传输用户密码135
16.2.2 防止通讯协议被轻易破解137
16.2.3 验证应用内支付的凭证138
16.3 本地文件和数据安全138
16.3.1 程序文件的安全138
16.3.2 本地数据安全140
16.4 源代码安全140
16.5 总结142
第17 章基于CoreText 的排版引擎. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
17.1 CoreText 简介143
17.2 基于CoreText 的基础排版引擎145
第18 章实战技巧. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
18.1 App Store 与审核181
18.1.1 撤销正在审核的应用181
18.1.2 申请加急审核181
18.1.3 应用在市场的名字182
18.1.4 测试设备数的限制182
18.1.5 如何将应用下架183
18.1.6 如何举报别的应用侵权183
18.1.7 iTunes Connect 后台操作出错184
18.1.8 Metadata Reject 184
18.2 开发技巧184
18.2.1 UILabel 内容模糊184
18.2.2 收起键盘184
18.2.3 NSJSONSerialization 比NSKeyedArchiver 更好185
18.2.4 设置应用内的系统控件语言185
18.2.5 为什么viewDidUnload 被废弃188
18.2.6 多人协作慎用Storyboard 189
18.2.7 避免滥用block 190
18.2.8 合并工程文件的冲突192
18.2.9 忽略编译警告193
18.3 Xcode 使用技巧193
18.3.1 Xcode 快捷键193
18.3.2 查找技巧195
18.3.3 JavaScript 文件设置调整195
18.3.4 清除DerivedData 196
18.3.5 target 信息异常197
18.3.6 下载Xcode 197
18.4 调试技巧197
18.4.1 模拟器快捷键197
18.4.2 覆盖安装注意事项197
18.4.3 给模拟器相册增加图片198
18.4.4 获得模拟器中的程序数据198
18.4.5 安装旧版本的模拟器199
18.4.6 模拟慢速网络199
18.4.7 异常断点与符号断点199
18.5 ipa 文件格式199
18.5.1 查看ipa 的内容199
18.5.2 查看ipa 中的图片200
18.6 为工程增加Daily Build 201
18.6.1 前言201
18.6.2 步骤201
18.6.3 遇到的问题206
18.6.4 总结206
18.7 使用脚本提高开发效率206
18.7.1 删除未使用的图片资源206
18.7.2 用脚本自动生成小尺寸的图片207
18.7.3 检查图片208
18.8 管理代码片段209
18.8.1 代码片段介绍209
18.8.2 定义自己的代码片段210
18.8.3 使用Git 管理代码片段211
18.8.4 其他代码片段管理工具211
III 第三部分:iOS 开发底层原理
第19 章Objective-C 对象模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
19.1 简介215
19.2 isa 指针215
19.3 类的成员变量217
19.4 对象模型的应用220
19.4.1 动态创建对象220
19.4.2 系统相关API 及应用222
19.4.3 参考文献226
第20 章Tagged Pointer 对象. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
20.1 原有系统的问题227
20.2 Tagged Pointer 介绍228
20.2.1 Tagged Pointer 228
20.2.2 特点230
20.3 注意事项和实现细节231
20.3.1 isa 指针231
20.3.2 64 位下的isa 指针优化231
20.3.3 isa 的bit 位含义232
20.3.4 总结233
20.3.5 参考文献233
第21 章block 对象模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
21.1 block 的内部数据结构定义235
21.2 用clang 分析block 实现237
21.2.1 NSConcreteMallocBlock 类型的block 的实现242
21.2.2 变量的复制243
21.3 注意事项243
21.3.1 避免循环引用243
21.3.2 ARC 对block 类型的影响244
『捌』 在ios沙盒机制下,下面哪个文件夹
1、iOS沙盒机制
iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。
1.1、每个应用程序都有自己的存储空间
1.2、应用程序不能翻过自己的围墙去访问别的存储空间的内容
1.3、应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。
通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容是:sandbox对应用程序执行各种操作的权限限制。
2、打开模拟器沙盒目录
下面看看模拟器的沙盒文件夹在mac电脑上的什么位置。
文件都在个人用户名文件夹下的一个隐藏文件夹里,中文叫资源库,他的目录其实是Library。
2.1 方法1、可以设置显示隐藏文件,然后在Finder下直接打开。设置查看隐藏文件的方法如下:打开终端,输入命名
显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
输完单击Enter键,退出终端,重新启动Finder就可以了
重启Finder:鼠标单击窗口左上角的苹果标志-->强制退出-->Finder-->
现在能看到资源库文件夹了。
打开资源库后找到/Application Support/iPhone Simulator/文件夹。这里面就是模拟器的各个程序的沙盒目录了。
2.2 方法2、这种方法更方便,在Finder上点->前往->前往文件夹,输入/Users/username/Library/Application Support/iPhone Simulator/ 前往。
username这里写你的用户名。
3、目录结构
默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件
Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
Library:存储程序的默认设置或其它状态信息;
Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
tmp:提供一个即时创建临时文件的地方。
iTunes在与iPhone同步时,备份所有的Documents和Library文件。
iPhone在重启时,会丢弃所有的tmp文件。
我们创建一个IosSandbox的项目来展开沙盒和文件读写等操作的练习。
创建后找到模拟器上对应的目录,
『玖』 ios简历项目经验怎么写
2、你在项目组中的位置、是否能独立解决问题;
3、你的业务知识与团队合作能力等。
技术显然是最重要的,但你需要非常用心的描述整个项目的技术框架,让招聘人员知道你从对宏观上架构很熟悉,然后突出你解决的技术问题。
下面我们参考一种项目描述:
本项目采用JSP+JavaBean+Struts开发,采用了MVC模式,表现层与业务层分离,易于维护、扩展
下面是我写的一段项目描述(虚拟的):
本项目结构上分为表现层、业务层和数据访问层,层次间的依赖关系自下到上。采用的技术有Struts,Spring,Hibernate,Log4J,JDom等。其中表现层采用Struts框架开发;业务层封装业务流程,为适应业务的变更,每一业务模块均有专门的接口及实现类,利用Spring的IoC功能将实现类注入给表现层的Action;数据访问层借助于Hibernate实现,代码简洁且可适应不同的数据库。事务部分利用Spring的声明式事务管理。为提高性能,采用ServletFilter实现了缓存代理
这段项目经验描述简单的勾划出了系统的结构,也表现出你非常熟悉Struts,Spring,Hiberante这几种技术。
同时可以注意到,其中一些重要环节描述的十分简略,比如事务、缓存代理
,这其实是故意的。
面试的时候很多人都怕对方突然问一个自己没有准备的问题,往往缺乏应变能力。一方面你需要多进行专门的练习,另一方面要知道面试时你并不总是被动的,等待对方发问。
如果你给对方的只是一份普普通通的简历,里面只提到了大家都会提及的JSP,Struts,那你只好等待对方随机的问题了。但是如果你的项目经验和描述像刚才那么写,对方就很可能会问你到底是如何在Spring中应用事务、如何使用缓存代理(如果对方是技术人员的话),这时你已经变被动为主动啦当然,前提是你写的这些技术要点一定是自己掌握的,事先已经想好如何表达的!这只是一点面试技巧里面的内容。
总之写好个人简历中项目经验中项目描述也是求职方法的一种。