objective-c php iOS开发60分钟入门

objective-c php iOS开发60分钟入门

本文面向已有其它语言(如Java,C,PHP,)编程经验的iOS开发初学者,初衷在于让我的同事一小时内了解如何开始开发iOS App,学习目标包括:

本文不包含任何高级的iOS开发知识,已学会iOS开发的同学不要看,看完这篇文章学会了的同学也不用再看了。

不仅是学习一门新语言

有过脚本开发经验的人(如,PHP,Shell)在刚开始学习iOS开发的时候,会觉得iOS开发的学习曲线比脚本语言要高,是的,这种感觉是对的。因为学iOS开发,不仅是学习一门新语言,它包括:

初学脚本语言通常不会来绘制图形界面、与人交互,iOS如果不做图形界面,像脚本语言一样处理文本操作数据库,就没啥意思了。

所以,过去我写别的新手入门教程,通常都是写《XXX入门15分钟教程》,而iOS就要花数倍的时间来写了。

环境准备

做iOS开发一定要有苹果的软件环境:Mac OS操作系统、-C编译器、设备模拟器等,开发工具倒不一定要用Xcode,只要是个源代码编辑工具就行(vim都行,只是没Xcode那么多功能)。

Mac OS

拥有Mac OS环境最简单的方法是找一台苹果电脑,包括iMac, Pro, Air, Mac Mini,但不包括苹果的移动设备(iPod Touch, , iPad, iPad Mini,它们运行的是iOS系统,不是Mac OS),苹果电脑在出厂的时候就会预装Mac OS,目前最新版本是Mac OS X 10.8,主流的版本还有Mac OS X 10.6、Max OS X 10.7。

如果囊中羞涩,可以借一台,或者上淘宝买个二手的。

黑苹果

提到iOS开发入门,似乎没办法不说黑苹果。所谓黑苹果,就是把Mac OS改造后安装在非苹果的硬件上,这是违反DMCA法案的,黑苹果的更多资料,可以在维基上找到

苹果电脑价格高,国内软件开发者生存压力大,所以黑苹果在国内也有一些真实的存在,国外当然也有啦。

黑苹果基本可以胜任iOS开发,但有一些问题:

上面这些虽然不会直接影响Xcode写代码、模拟器测试,但写着写着想上网查个东西的时候,不能翻页,确实挺影响心情的。所以,钱包允许的前提下,还是搞个苹果电脑省心一些。

Xcode 和 模拟器

Xcode可以在苹果官网免费下载:Xcode下载地址

安装Xcode时会自动安装iOS SDK和模拟器。

这么强大的IDE居然是免费的,还是挺让人开心的。

从改一个现成的应用开始吧

学一门新软件开发技能,能够第一时间做出一个可运行的产品非常重要,有助于给自己正面激励,我上大学的时候,有很多次想学一门新语言,往往花了半个月,还沉浸在数据类型和语法字典里,连第一个Hello World都没做出来。

这一次,就让我们从改一个现成的应用开始吧。

下载

首先,我们从苹果开发者中心下载一个示例代码回来。我选了。

在本文档的末尾,还有一些其它的网址可以下载开源iOS产品或者代码段,但我试了一下,还是Apple Code最容易成功。

下载回来的zip文件最好保存在”下载”或者”文稿”目录里,因为在Mac OS 10.8以前,有些目录(例如/var//tmp)在中是看不到的,要通过的“前往 > 前往文件夹”功能才能进入。

打开

有三种方式可以打开一个iOS

双击文件

打开,进入刚刚下载解压的目录,找到.文件,双击之,Xcode会自动启动,并打开这个项目

在Xcode里选择打开通过命令行打开

在Mac OS 10.8以前,有些目录(例如/var//tmp),在和Xcode的File > Open对话框中,点击鼠标是找不到的,这时候就要通过命令行终端来打开了。

打开终端,执行:

cd /ToolBarSearch的父目录/ToolBarSearch
open -a Xcode

open -a是mac os的系统命令,除了iOS项目,别的项目也可以这样打开。

运行刚下载的应用

点击Xcode左上角的Run按钮(或者同时按下和R键),Xcode会编译源码并在模拟器中运行这个应用。

编译成功会在屏幕上淡淡地显示“Build ”。反之,失败就显示“Build ”且不启动模拟器。

修改

在模拟器上看到“ using…”了吧,下面我们改掉它。

当然,这些操作,你也可以在终端下通过grep和vim完成。

运行修改后的应用

按 R运行,看看,是不是看到效果啦?

是的,修改一个应用就这么简单。

-C

-C是苹果应用软件(包括苹果电脑上的Mac OS App和移动设备上的iOS App)的开发语言。它是一种面向对象的编程语言。

苹果公司还提供了一个软件,叫 ,简称IBobjective-c php iOS开发60分钟入门,用于可视化的界面制作,就像用做网页objective-c php iOS开发60分钟入门,或者像 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里的动态方法名:

$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秒,就会立刻执行objective-c php,执行的时候数据还在路上呢,页面就要变空白了。

继承

继承是写在定义里面的。语法为:子类名在左,父类名在右,中间用冒号分隔。 示例:

@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 Touch

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中打开你的项目,在Xcode顶部工具栏的Stop按钮(Run按钮右边那个黑色正方形按钮)右边,有个下拉菜单,显示着 “ > 5.0 ” (即 你的应用英文名 > 当前选中的调试 ),点击这个下拉菜单,选中 5.0 (这里的5.0是指iOS版本,不是的意思,如果你的项目是iPad应用objective-c php,请选iPad 5.0 ),再按“Run”按钮,Xcode就会自动把当前正在编辑开发的应用编译并安装到模拟器上。

在模拟器上操作时,如果执行过程中遇到了你在Xcode里设置的断点,模拟器会暂停运行,并将当前活动窗口切换回Xcode,供你调试。

在Xcode里增加或者取消了断点,不需要重新编译和安装应用即可生效。

切换被模拟的设备

模拟器的“硬件”菜单,可以选择想要模拟什么设备,有iPad、可选。

切换模拟的iOS版本

在模拟器的“版本”菜单,可以选择要模拟什么版本的iOS。设备和版本是彼此独立的, 4S可以有5.0,5.1,6.1几种iOS版本,当然了, 5不可能有4.3的iOS版本。

触摸屏

用鼠标点击(不区分左右键)模拟器上的、iPad屏幕,就是在模拟用手指触摸,iPad的屏幕,可以实现一些触摸效果比如:

多指手势

多指手势比较复杂,在白苹果笔记本上可以模拟简单的双指手势,白苹果的触控板天然支持多指触摸,但要定位到模拟器的区域再响应多指手势就需要借助一些额外的键啦:

输入法和键盘输入中文

手机上特有的输入法(比如九宫格输入法)不能模拟。模拟器默认的iOS软键盘只有英文输入,在测试应用的时候,我们要用到中文,有两个办法:

使用Mac电脑的键盘

如果要输入大量文本,使用模拟器里的软键盘效率太低,这时候可以使用物理键盘,方法是:在Mac OS顶部的模拟器菜单栏,点击”硬件”菜单,勾选下拉菜单中的“模拟硬件键盘”。以后再用模拟器运行iOS应用时,点击iOS应用中的输入框,软键盘就不弹出来了,可直接使用Mac电脑的物理键盘输入。

注意:

地理位置

但Mac电脑没有定位用的硬件(GPS)和软件基础,因此模拟器不能自动获得当前的地理位置,不能用模拟器测试定位功能。(注意objective-c php,虽然WiFi也可以独立定位——iPad WiFi版没有GPS也可以定位,但Mac电脑的WiFi不具备定位相关的软件)

要在模拟器里测试依赖地理位置的功能(如”我附近的xx”),可以手工指定一个经纬度给模拟器,方法:在Mac电脑顶部的模拟器菜单,点击”调试 – 位置 – 自定位置”,会弹出一个对话框,在弹出的框内填入经纬度即可。

如何获得经纬度? 上谷歌地图(),在地图上找到你想要的位置(比如你想知道杭州大厦的位置,就在通过搜索框找到杭州大厦),点击右键,选择“这儿是什么”,搜索框中就会出现这个位置的经纬度了,前面是纬度,后面是经度。咱们天朝的版图,都是北纬和东经。

摄像头

Mac电脑有摄像头,但Mac OS没有设计API给iOS模拟器调用,所以,不能用模拟器测试对焦闪光灯等功能。

要在模拟器上测试依赖照片的功能,可以在代码里做一个,即当代码检测到摄像头不可用时,弹出一个照片选择器,让测试人员从相册里选择一幅照片,来进行后续的操作(如照片美化、人脸识别、条码扫描)。

真机测试

模拟器能验证你开发的iOS应用的大部分功能,但有些Mac设备上不具备的硬件,模拟器是不能模拟的。前文提到了一个绕过这些限制的办法,但获取当前位置、拍照、加速度感应这些是模拟不了的,一款应用发布给消费者之前,必须要在真实设备上验证过。

将未提交App Store审核通过的应用安装到iOS设备上测试,有三种办法:

破解Xcode是违法行为(越狱是合法的),而且挑版本挑得厉害,不是所有Xcode版本都能破解,也不是所有Xcode的破解版都能和越狱的iOS配合好。越狱+SSH上传跟企业部署一样效率低(部署效率低,无法激活Xcode中的断点),只能用于QA验收,不适合开发自测。综上所述,最适合开发实时测试的就是第一个正规途径了。下面重点讲这个:

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » objective-c php iOS开发60分钟入门

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们