编程经验的iOS开发初学者如何开始开发iOSApp?
发表时间:2023-10-19 09:10:48
文章来源:炫佑科技
浏览次数:140
菏泽炫佑科技
编程经验的iOS开发初学者如何开始开发iOSApp?
本文面向已经有其他语言(如Java、C、PHP等)编程经验的iOS开发初学者。 初衷是让同事们了解如何在一小时内开始开发iOS Apps。 学习目标包括:
本文不包含任何高级的 iOS 开发知识。 已经学过iOS开发的同学不要看,看完本文已经学会的同学也不需要再看。
不仅仅是学习一门新语言
有脚本开发经验的人(比如PHP、Shell)在刚开始学习iOS开发时会感觉iOS开发的学习曲线比脚本语言要高。 是的,这种感觉是正确的。 因为学习iOS开发不仅仅是学习一门新语言,它还包括:
初学者通常不会使用脚本语言来绘制图形界面并与人交互。 如果iOS不像脚本语言那样制作图形界面、处理文本、操作数据库,那就毫无意义了。
因此,以前我在写其他新手入门教程的时候,一般都会写“15分钟XXX入门教程”,但对于iOS来说,写起来就要花好几倍的时间。
环境准备
做iOS开发,必须有Apple的软件环境:Mac OS操作系统、-C编译器、设备模拟器等。开发工具不一定要用Xcode,只要是源码编辑工具即可(vim会可以,但是没有Xcode那么多功能)。
苹果系统
拥有Mac OS环境*简单的方法就是找一台苹果电脑,包括iMac、Pro、Air、Mac Mini,但不包括苹果的移动设备(iPod Touch、iPad、iPad Mini,这些设备运行的是iOS系统,而不是Mac OS) ),苹果电脑在出厂时都会预装Mac操作系统。 *新版本为Mac OS X 10.8,主流版本包括Mac OS X 10.6和Max OS X 10.7。
如果你缺钱,可以借一个或者在淘宝上买一个二手的。
黑苹果
说到iOS开发入门,似乎就不能不提到黑苹果。所谓黑苹果,就是修改Mac OS,安装在非苹果硬件上。 这违反了 DMCA 法案。 有关黑苹果的更多信息可以在维基百科上找到。
苹果电脑价格居高不下,国内软件开发商生存压力巨大。 所以,中国有一些真正的黑苹果,国外当然也有一些。
黑苹果基本具备iOS开发能力,但也存在一些问题:
虽然上面这些不会直接影响Xcode代码编写和模拟器测试,但是当我写到想上网查东西的时候,却无法翻页app开发,这确实影响了我的心情。 因此,如果你的钱包允许的话,买一台苹果电脑会更容易。
Xcode 和模拟器
Xcode可以从苹果官网免费下载:Xcode下载地址
安装 Xcode 时会自动安装 iOS SDK 和模拟器。
这么强大的 IDE 还是免费的,真是太好了。
首先修改现有应用程序
学习一门新的软件开发技能并能够尽快做出一个可行的产品是非常重要的。 它有助于给自己积极的动力。 我在大学的时候,有很多次想学习一门新的语言,但往往需要半年的时间。 几个月来,我仍然沉浸在数据类型和语法字典中,甚至没有做出**个Hello World。
这次,我们从修改一个现成的应用程序开始。
下载
首先,我们从苹果开发者中心下载示例代码。 我选择了。
在这篇文档的*后,还有一些其他的网址可以下载开源的iOS产品或者代码片段,但是我尝试了一下,发现Apple Code是*容易成功的。
*好将下载的zip文件保存在“”或“”目录中,因为在Mac OS 10.8之前,某些目录(例如/var//tmp)在Mac OS中看不到。 您需要转到“转到”> 要访问它,请使用“转到文件夹”功能。
打开
iOS的打开方式有3种
双击该文件
打开,进入刚刚下载解压的目录,找到. 文件,双击它,Xcode将自动启动并打开项目
选择 Open in Xcode 通过命令行打开
Mac OS 10.8之前,在Xcode的“文件”>“打开”对话框中单击鼠标无法找到某些目录(例如/var//tmp)。 这时候就必须通过命令行终端来打开它们。
打开终端并执行:
cd /ToolBarSearch的父目录/ToolBarSearch
open -a Xcode
open -a 是 mac os 的系统命令。 除了iOS项目外,其他项目也可以通过这种方式打开。
运行您刚刚下载的应用程序
单击 Xcode 左上角的 Run 按钮(或同时按 R 键),Xcode 将编译源代码并在模拟器中运行应用程序。
如果编译成功,屏幕上会浅色显示“Build”。 否则,如果失败,会显示“Build”,模拟器不会启动。
*新的Xcode在编译后会报告IB,而iOS7则没有。 这时需要手动点击错误报告,在面板中找到build for并选择合适的版本。
修订
你在模拟器上看到“using...”,下面我们来改一下。
当然,你也可以在终端中通过grep和vim来完成这些操作。
运行修改后的应用程序
按R运行看看有没有看到效果?
是的,修改应用程序就是这么简单。
-C
-C是苹果应用软件(包括苹果电脑上的Mac OS App和移动设备上的iOS App)的开发语言。 它是一种面向对象的编程语言。
苹果还提供了一款软件,简称IB,用于可视化界面制作,就像用于网页一样,或者像Basic用于桌面软件一样。 后来IB被集成到Xcode中,成为Xcode的一部分。 本文档不讲IB,只讲-C,因为:
C 的超集
-C 扩展了 ANSI C,是 C 的超集,也就是说:
除了面向对象的语法和风格(下面讨论)之外,其他非面向对象的语法和数据类型与C完全相同,因此本文不再赘述。 让我们看一个经典的Hello World示例:
#import
int main(int argc, char *argv[]){
@autoreleasepool{
NSLog(@"Hello World!");
}
return 0;
}
是不是感觉回到了大一学C语言的时候呢? 看起来和C几乎一样,对吧? 是的,因为我还没有使用过它的面向对象的特性,哈哈!
消息语法风格
-C 的面向对象语法源自消息传递 ( ) 风格。 从源码风格上来说,这是与C语言(包括C/C++、Java、PHP)*大的区别。
在Java和C++世界中,我们调用对象的某个方法。 在-C 中,这称为向类型发送消息。 这不仅仅是文字游戏,它们的技术细节也不同。
在Java中,对象和方法之间的关系是非常严格的。 方法必须属于类/对象,否则编译会报错。 在-C中,类型和消息之间的关系比较松散。 消息处理直到()才动态确定。 向它无法处理的类型发送消息只会引发异常而不会挂起。
[obj undefinedMethod];
如果你在代码中调用了未定义的方法(这是Java界的俗话,专业术语是向obj对象传递一条它无法处理的消息),Xcode会警告你,但编译会成功,但运行时会出现错误。 它会输出这样的错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSObject undefinedMethod]: unrecognized selector sent to instance 0x8871710'
类似 Java 的 OOP 概念
- C中的一些面向对象的概念在Java中也可以实现(只能说是类似,不完全一样)。 我的读者基本上是 Java 和 PHP 程序员。 下面我会尽量使用Java。 概念类比。
有人整理了一个Java和-C之间的概念和数据类型表,看这里
细绳
-C 字符串用双引号括起来,并在引号前添加@符号,例如:
title = @"Hello";
if(title == @"hello") {}
PHP 程序员应该注意,这里不能使用单引号,即使只有一个字符。 -C 与Java和C一样,双引号表示字符串。
函数调用
前面说过,在不涉及面向对象的情况下,它和C是一模一样的。 以下是函数调用的几个示例:
不带参数
startedBlock();
带参数
NSLog(@"decrypted string: %@", str);
CGRectMake(0,0,0,0);
将消息传递给不带参数的类/实例方法
[obj method];
对应的Java版本
obj.method();
取一个参数:
[counter increase:1];
对应的Java版本
counter.increase(1);
有多个参数
对于C程序员来说,这是*难接受的,也是*反人类的:
- (void) setColorToRed: (float)red Green: (float)green Blue:(float)blue {...} //定义方法
[myObj setColorToRed: 1.0 Green: 0.8 Blue: 0.2]; //调用方法
对应的Java版本
public void setColorToRedGreenBlue(float red, float green, float blue) {...}
myObj.setColorToRedGreenBlue(1.0, 0.8, 0.2);
消息嵌套
UINavigationBar *bar = [[[UINavigationBar alloc] init] autorelease];
对应的Java版本
UINavigationBar bar = UINavigationBar.alloc().init().autorelease();//Java没有指针,所以星号去掉了
类接口和实现
-C类分为两部分:接口定义和实现。 接口定义()放在头文件中,文件扩展名是.h,实现()放在实现文件中,文件扩展名是.m(还有一个扩展名是.mm,表示混合代码C 和 C++)。
接口定义也可以写在.m文件中,但*好不要这样做
需要注意的是,与-C*接近的概念是C和C++中的头文件,它是成对出现的,用于声明类的成员变量和方法。 它与Java的概念完全不同:
在-C中,概念与Java类似,下面将讨论。
参见示例:
@interface MyClass {
int memberVar1;
id memberVar2;
}
-(return_type) instance_method1;
-(return_type) instance_method2: (int) p1;
-(return_type) instance_method3: (int) p1 andPar: (int) p2;
@end
@implementation MyClass {
int memberVar3;
}
-(return_type) instance_method1 {
....
}
-(return_type) instance_method2: (int) p1 {
....
}
-(return_type) instance_method3: (int) p1 andPar: (int) p2 {
....
}
@end
接口和实现以@、@开头,以@end结尾。 “@”符号是-C中一个非常神奇的符号。
冒号也是方法名称的一部分,并且:是两个不同的方法名称,而不是第二个带参数的方法名称。
上述代码对应的Java版本:
public class MyClass {
protected int memberVar1;
protected pointer memberVar2;
private int memberVar3;
public (return_type) instance_method1() {
....
}
public (return_type) instance_method2(int p1) {
....
}
public (return_type) instance_method3andPar(int p1, int p2) {
....
}
}
私有方法和公共方法
.h头文件中写的方法都是的,-C中没有私有方法的概念(不写就傻了,哈哈哈哈)。
官方没有提到-C中如何实现私有方法。 我查了一下,统一的答案是只有使用私有方法才能达到效果。 不过根据我的测试,即使采用了,也无法阻止外部代码调用这个“私有方法”,但是Xcode不支持“私有方法”的自动补全,并且会有警告提示。 运行的时候,还是会成功的。 各位读者都知道是这样的,这里就不多说了。
变量和属性类方法和实例方法类方法
类方法在Java和PHP中,无需实例化即可调整。 类方法以加号为前缀。 例子:
类定义
@interface MyClass
+(void) sayHello;
@end
@implementation MyClass
+(void) sayHello {
NSLog(@"Hello, World");
}
@end
使用
[MyClass sayHello];
实例方法
实例方法是Java和PHP中的普通方法,必须先实例化才能调用。 实例方法以减号为前缀。 例子:
类定义
@interface MyClass : NSObject
-(void) sayHello;
@end
@implementation MyClass
-(void) sayHello {
NSLog(@"Hello, World");
}
@end
使用
mycls = [MyClass new];
[mycls sayHello];
它是一个方法指针,类似于PHP中的动态方法名:
class Hello {
public function sayHello() {}
public function test() {
$fun_name = "sayHello";
$this->$fun_name();
}
}
在-C中,主要用来做两类事情:
绑定控件触发的动作
@implementation DemoViewController
- (void)downButtonPressed:(id)sender {//响应“按钮被按下事件”的方法
UIButton *button = (UIButton*)sender;
[button setSelected:YES];
}
- (void)drawAnButton {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = _frame;
btn.tag = 1;
btn.backgroundColor = [UIColor clearColor];
[btn addTarget: self
action: @selector(downButtonPressed:)
forControlEvents: UIControlEventTouchUpInside];//当这个按钮被按下时,触发downButtonPressed:方法
}
@end
延迟异步执行
@implementation ETHotDealViewController
- (void)viewDidLoad {
//获取数据源
HotDealDataSource *ds = [[HotDealDataSource alloc]init];
[ds reload];
_items = ds.items;
[self performSelector: @selector(refreshTable) withObject: self afterDelay: 0.5];//延迟0.5秒调用refreshTable方法
}
-(void)refreshTable
{
[self.tableView reloadData];
}
@end
本例中获取数据源是通过组件异步调用服务器端HTTP接口。 使用数据源返回的数据。 如果没有0.5秒的延迟,就会立即执行。 执行过程中,数据还在途中,页面会变成空白。
继承
继承写在定义里了。 语法是:子类名在左边,父类名在右边,中间用冒号分隔。 例子:
@interface MyClass : NSObject
@end
对应的Java版本是:
public class MyClass extends NSObject {
}
协议()
就在 Java 和 PHP 中。
协议的定义
该协议使用@关键字定义:
@protocol Printable
-(void)print:(NSString)str;
@end
对应的Java版本是:
publilc interface Printable {
public void print(String str);
}
协议继承
协议本身还可以继承其他协议:
@protocol Printable
-(void)print:(NSString)str;
@end
对应的Java版本:
public interface Printable extends NSObject {
public void print (String str);
}
可选方法
协议可以包含可选方法,顾名思义,这些方法可能无法由类实现:
@protocol Printable
@optional
-(void)print:(NSString)str;
@end
通过添加@关键字,类在该协议中不需要实现print:方法。
Java中没有类似的实现,只是有一些方法有注释,但这是一个特例。
协议的实施
类对某些协议的实现写在其定义中。 语法为:协议名用尖括号括起来,多个协议名用逗号分隔,协议写在父类右侧(如果没有父类则直接写在右侧)的子类)。
例子:
@interface MyClass : NSObject
@end
,是两个协议。
对应的Java版本是:
public class MyClass extends NSObject implements Printable, Drawable {
}
分类()
分类可以向现有类添加方法,而无需更改其源代码。 Java 或 PHP 中没有类似的功能。
例如,它是一个-C内置系统类,我们要为其添加方法,如下所示:
头文件:+Json.h
@interface NSObject (Json)
-(NSString)toJson;
@end
实现文件:+Json.m
@implementation NSObject (Json)
-(NSString)toJson {
//...
}
@end
使用时只需包含+Json.h,实例化该类,即可使用方法:
import "NSObject+Json.h"
@implementation XYZController
-(void)test {
NSObject *obj = [[NSObject alloc]init];
NSString *str = [obj toJson];
}
@end
当然,原来的方法还是可以用的,没有任何改变,只是多了一种方法而已。 是不是看起来和继承有很大的不同(只不过使用的时候是实例化而已)? 我们再看一个无法实现继承的例子:
头文件:+Json+XML.h
@interface NSObject (Json)
-(NSString)toJson;
@end
@interface NSObject (XML)
-(NSString)toXML;
@end
实现文件:+Json+XML.m
@implementation NSObject (Json)
-(NSString)toJson {
//...
}
@end
@implementation NSObject (XML)
-(NSString)toXML {
//...
}
@end
使用:
import "NSObject+Json+XML.h"
@implementation XYZController
-(void)test {
NSObject *obj = [[NSObject alloc]init];
NSString *json = [obj toJson];
NSString *xml = [obj toXML];
}
@end
可可触感
Cocoa是Mac OS App的开发框架,Cocoa Touch是iOS开发的框架。 Cocoa Touch 和 Cocoa 大部分相同,只是 Cocoa Touch 具有一些移动设备特有的附加功能,例如触摸屏、加速度传感器和 GPS 定位。 Cocoa 中的多任务和多窗口功能在 Cocoa Touch 中不可用(或者与 Cocoa 不完全相同)。
就像学习了Java语言之后,你需要学习一些、、、(或者其他类似的Java类库),然后才能开始制作J2EE应用程序。 学习了-C语言之后,还需要学习Cocoa Touch框架才能成功开发iOS应用程序。
*常用的设计模式之一
Cocoa Touch 大量使用(委托)设计模式。
常用控件:按钮、文本块、图片、输入框导航栏 Xcode运行
快捷键:R
搜索 搜索文本 搜索文件 创建新文件/目录
建议新建一个然后添加。
断点模拟器和真机测试模拟器测试
在 Xcode 中打开您的项目。 )顶部工具栏的“停止”按钮(“运行”按钮右侧的黑色方形按钮)右侧,点击这个下拉菜单,选择5.0(这里的5.0是指iOS版本,不是iOS版本。如果您的项目是iPad应用程序,请选择iPad 5.0),然后按“运行”按钮,Xcode会自动编辑开发的应用程序,将其编译并安装到模拟器上。
在模拟器上操作时,如果执行过程中遇到您在 Xcode 中设置的断点,模拟器会暂停并将当前活动窗口切换回 Xcode 供您调试。
在Xcode中添加或取消断点将生效,无需重新编译和安装应用程序。
切换模拟设备
在模拟器的“硬件”菜单中,您可以选择要模拟的设备,包括iPad和iPad。
切换模拟iOS版本
在模拟器的“版本”菜单中,您可以选择要模拟的iOS版本。 设备和版本是相互独立的。 4S 可以有 iOS 版本 5.0、5.1 和 6.1。 当然,5不能有iOS版本4.3。
触摸屏
用鼠标在模拟器上点击iPad屏幕(不区分左右键)就是模拟用手指触摸iPad屏幕,可以实现一些触摸效果如:
多指手势
多指手势更加复杂。 白苹果笔记本上可以模拟简单的两指手势。 白苹果触摸板天然支持多指触摸,但是要定位模拟器的区域,然后响应多指手势,还需要一些额外的工具。 钥匙:
中文输入法及键盘
手机上特有的输入法(如九宫格输入法)无法模拟。 模拟器默认的iOS软键盘只有英文输入。 在测试应用程序时,我们需要使用中文。 有两种方法:
使用 Mac 电脑键盘
如果需要输入大量文本,使用模拟器中的软键盘效率太低。 这时候就可以使用物理键盘了。 方法是:在Mac OS顶部的模拟器菜单栏中,点击“硬件”菜单,勾选“模拟硬件键盘”。 以后使用模拟器运行iOS应用程序时,点击iOS应用程序中的输入框,就不会弹出软键盘了。 您可以直接使用Mac电脑的物理键盘进行输入。
注意:
地理位置
但Mac电脑不具备定位的硬件(GPS)和软件基础,因此模拟器无法自动获取当前地理位置,无法使用模拟器测试定位功能。 (注意,虽然WiFi也可以独立定位——iPad WiFi版无需GPS即可定位,但Mac电脑的WiFi没有定位相关软件)
要在模拟器中测试与地理位置相关的功能(例如“xx靠近我”),您可以手动为模拟器指定纬度和经度。 方法:在Mac电脑顶部的模拟器菜单中,点击“调试-位置-自定义位置”,会弹出一个对话框,在弹出的框中填写经纬度即可。
如何获取纬度和经度? 进入谷歌地图(),在地图上找到您想要的位置(例如,如果您想知道杭州大厦的位置,只需通过搜索框找到杭州大厦即可),右键单击,选择“这里是什么” ,搜索框会出现该位置的经度和纬度,前面是纬度,后面是经度。 我们天朝的疆域,全是北纬东经左右。
相机
Mac 电脑有摄像头,但 Mac OS 没有设计供 iOS 模拟器调用的 API。 因此,您无法使用模拟器来测试对焦闪光等功能。
要在模拟器上测试依赖照片的功能,您可以在代码中制作一个。 即当代码检测到相机不可用时,会弹出照片选择器,让测试者从相册中选择一张照片进行后续操作(如照片美化、人脸识别、条码扫描)。
真机测试
模拟器可以验证您开发的iOS应用程序的大部分功能,但模拟器无法模拟Mac设备上不可用的一些硬件。 上一篇文章提到了一种绕过这些限制的方法,但是无法模拟获取当前位置、拍照、加速度计。 应用程序在发布给消费者之前,必须在真实设备上进行验证。
可以通过三种方式将尚未提交App Store审核的应用程序安装到iOS设备上进行测试:
破解Xcode是非法的(越狱是合法的),而且版本选择非常困难。 并不是所有的Xcode版本都可以破解,也不是所有破解版本的Xcode都能很好的与越狱的iOS配合使用。 越狱+SSH上传和企业部署一样效率低下(部署效率低,Xcode中断点无法激活)。 只能用于QA验收,不适合开发和自测试。 综上所述,*适合开发实时测试的方式是**种形式化方式。 让我们重点关注这一点:
拥有开发者帐户
苹果分为个人开发者和企业开发者,费用分别为每年99美元和299美元。 他们可以分别注册100个和500个Apple测试设备。 单位数量的限制不会在付款年内取消。 例如,2013年4月1日付款成功,则付费会员有效期为2014年3月31日之前。在此期间,如果您注册1个单位编程经验的iOS开发初学者如何开始开发iOSApp?,您将失去1个名额。 即使该设备在注册和使用后立即被删除,减少的配额也不会回来。
付款前*好询问一下周围的同事是否已经付款。 如果是的话,你只需要注册一个免费的Apple ID(你在App Store安装软件时使用的Apple ID),让他给你发邀请邮件,并将你的Apple ID添加到他的团队中即可。 苹果会认为你们两个是一个团队,你们各自使用自己的帐户并共享 100 台设备的限制。 这是合法的。
安装证书和私钥证书
如果您不想看到下面点击跳转各个页面,可以直接使用浏览器访问证书管理。 如果你想登录,可以用你的Apple ID登录(前提是你已经付过钱,或者找付过钱的人把你加进团队)。
是不是觉得很烦人,或者想知道下次没有像我这样的文件时如何进入证书管理呢? 按着这些次序:
页面上有一个“您的”区域,下面有一个圆形按钮。 这是您的个人证书,请下载。 下一行,有一句话“如果您没有WWDR,请立即点击这里”。 这是Apple的公共证书,也是下载的。
双击下载的证书。 安装证书时,系统会提示您输入密码。 这是[钥匙串访问工具]要求您提供Mac OS帐户启动密码(相当于Linux中的sudo),而不是Apple ID的密码。 不犯错误。
安装私钥
如果你和另一个同事有一个共享帐户,只需让他给你一个私钥,这是一个扩展名为 p12 的文件。 双击它,钥匙串访问会自动出来,要求你输入密码。 系统将要求您提供此密码。 想要p12文件的人不是你的Mac OS系统启动密码,也不是你的Apple ID密码。
注册设备以在真实的 iOS 设备上运行 beta 程序
返回Xcode主界面。 在“停止”按钮的右侧(“运行”按钮右侧的黑色方形按钮),有一个下拉菜单,显示“> 5.0”(即您的应用程序的英文名称>当前选择的调试)。 单击此下拉菜单。 选择您的真实设备名称并按“运行”按钮。 Xcode会自动编译并安装当前正在编辑开发的应用程序到真机上进行测试!
作为 IPA 包发布到 App Store
IPA包本质上是一个ZIP压缩包,但它有特殊的目录结构,扩展名为ipa。 生产方法如下:
自动批量包装
除了App Store之外,还有很多其他的iOS应用市场(如91助手、同步推送等)。 如果一个应用需要发布到多个应用市场,并且它们的代码稍有不同(比如统计代码不同),按照上述方法手动修改源码,然后打包是比较容易出错的,然后恢复它。 好消息是 Xcode 有命令行。 我们可以编写一个shell脚本,首先使用se自动修改源码,然后调用Xcode命令行编译得到你的——app.app目录,*后调用zip、mv等命令自动执行ipa打包动作上一章提到过。
阅读应用程序代码并从头开始创建一个新应用程序:其他代码中的 Hello World 控件大小
iOS App中的控件大小和字体大小均参考Point。 设备(4、4S、5;新Pad)和非设备(3GS、iPad、iPad 2)的点数相同,尽管4的分辨率是3GS的2倍。 例如,设备上为 20 像素,非设备(3G)上为 10 像素。
项目成员之间进行交流时,应使用点而不是像素。
SVN操作包含@符号的文件
文件名,例如 @ 符号,例如:
svn del icon@2x.png@
svn info Default@2x.png@
如果你一次移动几十个png文件然后svn它们,你可以使用shell批处理:
svn status | awk '($1=="!"){print $2}' | grep -v @ | xargs svn del
上面的命令从svn中删除文件名不包含@符号且不再在硬盘上的文件。
for file in `svn status | awk '($1=="!"){print $2}' `; do svn del $file"@"; done
上面的命令从svn中删除文件名包含@符号且不再位于硬盘上的文件。
svn add 和上面一样,按照同样的方法就可以了。
Xcode中的代码结构与操作系统上的文件系统不一致
建议在Xcode中创建该目录,然后单击“Add Files to”将其添加到项目中。
5 适应
5与上一款不同,采用了4英寸的屏幕,所以它的Point数变成了320*568
作为一名开发者,有一个学习氛围和交流圈子尤为重要。 这里有一个iOS交流群:无论你是新手还是高手,都欢迎你加入,分享BAT、阿里巴巴面试题、面试经验,讨论技术,iOS开发者交流,共同学习成长!