刚接触 iOS
开发,作为菜鸟,感觉知识点是不少的,有必要进行整理。这里暂时只说针对iPhone的开发吧,iWatch神马的……
工具和语言
先说Objective-C
吧,虽然Apple发布了Swift
,不过在2.0
版本或者更稳定的版本发布之前,还是老老实实学OC
吧。
使用官方的IDE——XCode
在官网或Mac App Store下载XCode就行了,感觉不像安卓那样麻烦,一切都配置好了,略去不讲。如果新建Project,会左侧边栏发现有iOS和OS X两种类型的app可以创建。左侧很多不明觉厉的东西。如果纯粹要练习OC
基础,可以选择创建Command Line Tool
,如果创建单页应用可以选择Single Page App
,等等。
什么是Cocoa?
按照我个人的理解,Cocoa之于iOS/OS X就相当于.NET Framework之于Windows。Cocoa里有两个框架对于iOS开发来说非常重要:Foundation Kit
和 UIKit
,如果是构建OS X Application
,你还需要用到AppKit
。
Foundation Kit
是后两者的基础:它提供了Objective-C
很多基础的类型。而Foundation
又是基于CoreFoundation
的,这是用纯C语言写的框架。
如果你在编程中看到类型名、方法名、对象名以NS
前缀(如NSString
类型),那么它就是存在于Foundation
中,如果以CF
为前缀,它就存在于CoreFoundation
中。参考下图:
说得不太清楚,反正以后都会接触到,你可以不用在意这些细节。
Objective-C小试牛刀
OC
只是在C
的基础上进行了一些扩展,因此,OC
是可以直接写C
的方法的,有时候还可以写C++
,称为Objective-C++
。
Hello World
按照惯例了来一段:
// main.m
#import <Foundation/Foundation.h>
int main(int argc,const char *argv[])
{
@autoreleasepool{
NSLog(@"Hello,World!");
}
return (0);
}
分析:
OC文件不是保存为
*.c
而是保存为*.m
格式的,头文件扩展名则不变。首先要导入
Foundation.h
,也就是前文中提到的Foundation Kit框架的头文件。但它使用了关键字import
而不是我们熟知的include
,前者可以防止重复引用问题,后者则需要一些宏代码配合。如果需要导入的文件在Cocoa中,则用<>
,如果在项目中,用""
。入口程序:
main
,argc argv
为启动时接受的命令行参数,这个不用多说。@autoreleasepool
内存“自动释放池”,在这个“池子”里,系统可以自动为创建的对象分配或移除内存,与这个有关的知识是内存管理和自动引用计数。NSLog
命令行的打印方法,使用起来和printf
差不多。@"Hello,World!"
,前面加@
代表这是一个Objective-C字符串(NSString
类型),如果不加则和普通C字符串无异。但99%的情况下,我们使用NSString
。@
这个字符在OC开发中非常常见,它代表这是一个OC语法。
类、对象和方法简介
在OC中,定义一个类,分为定义类的接口和实现类两个部分,并且前者往往在.h
文件中,后者往往在.m
文件中,要将两者相关联,还需要后者import
前者。
想要实例化一个类,可以使用new
关键字或结合使用alloc init
,貌似后者用的多一些。关于二者的区别以及为毛不推荐使用new
,请看这里。
然后说方法,哎算了,直接上代码吧:
定义一个“学生”类,以及实例化出一个“小明”,python
是这么写的:
class Student(object):
BELONG = "High School"
# 构造方法
def __init__(self,name):
self.name = name; # 实例属性
self.score = 0
# 实例方法
def doHomework(self,homework,speed):
print 'doing' + homework + ' Homework' + speed + '...'
def getScore(self):
print "Score:" + str(self.score)
return self.score
def setScore(self,score):
self.score = score
# 类方法
@classmethod
def getBlong():
print 'Belong : ' + Student.BELONG
#构造一个小明
if __name__ == '__main__':
xiaoming = Student("XiaoMing")
xiaoming.doHomework('Math','Fast') # doingMath Homework...
xiaoming.setScore(95)
xiaoming.getScore()
再用java
:
public class Student {
static String belong = "High School";
private int score = 0;
private String name;
// 构造方法
public Student(String name){
this.name =name;
}
// 实例方法
public void doHomework(String homework,String speed){
System.out.println("doing " + homework + " Homework " + speed +"...");
}
public int getScore(){
System.out.println(Integer.toString(this.score));
return score;
}
public void setScore(int score){
this.score = score;
}
// 类方法
static void getBelong(){
System.out.println("Belong: "+belong);
}
public static void main(String[] args){
Student xiaoming = new Student("xiaoming");
xiaoming.doHomework("Math","Fast");
xiaoming.setScore(95);
xiaoming.getScore();
Student.getBelong();
}
}
嗯,下面上Objective-C
//++++++++++++++++++++++++++ Student.h ++++++++++++++++++++++++++++
// 这里定义接口,告诉.m文件需要实现哪些方法,但不是强制的。
// Student.h
#import <Foundation/Foundation.h>
@interface Student: NSObject
{
static NSString *belong;
int score;
NSString *name;
}
// 方法接口声明,加号代表类方法,减号代表实例方法,括号里是返回类型,冒号后是所需参数。
+(void) getBelong;
-(NSString *) name;
-(void) initWithName:(NSString *) newName WithScore:(int) newScore; // 初始化方法。
-(void) setName:(NSString *) newName;
-(NSString *) name; // getName 方法,OC中getter方法一般不写get
-(void) setScore:(int) newScore;
-(int) score; // getScore 方法,OC中getter方法一般不写get
-(void) doHomework:(NSString *) homework WithSpeed:(NSString *) speed;
@end
然后是m文件:
//++++++++++++++++++++++++++ Student.m ++++++++++++++++++++++++++++
#import "Student.h"
// interface
@interface Student: NSObject
@end
// -----------------
// implementation
@implementation Student
{
static NSString *belong = @"High School";
int score = 0;
NSString *name;
}
+(void) getBelong{
NSLog(@"Belong: %@",belong);
}
-(void) initWithName:(NSString *) newName WithScore:(int) newScore{
self.name = newName;
self.score = newScore;
}
-(void) setName:(NSString *) newName{
self.name = newName;
}
-(NSString *) name{
NSLog(@"My Name is %@",self.name);
return name;
}
-(void) setScore:(int) newScore{
self.score = newScore;
}
-(int) score{
NSLog(@"My Name is %i",self.core);
return self.score;
}
-(void) doHomework:(NSString *) homework WithSpeed:(NSString *) speed{
NSLog(@"doing %@ Homework %@",homework,speed);
}
@end
然后是main文件:
//++++++++++++++++++++++++++ main.m ++++++++++++++++++++++++++++
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Student *xiaoming = [[Student alloc] init];
/*
OC的内存管理机制和.net或java的全自动内存回收不同,它大多数时候都需要手动管理。
alloc大致意思是给对象分配内存。init顾名思义是完成初始化。上述代码也可以写作:
Student *xiaoming = [Student new];
*/
[xiaoming initWithName:@"Xiaoming" WithScore:95];
/*
注意,这里的方括号调用类或对象的方法,当然有时候也可以用点语法,但这里不行。
OC里不推荐直接给对象的属性赋值,而是给定义getter和setter方法。
当然OC也提供了给属性直接赋值的语法,例如:
xiaoming->name = @"Xiaoming";
当然,每给对象定义一个属性,并且你需要读写它时,都需要给其定义getter或setter
方法,这太累了,OC2.0为其增加了 @property 语法,可以极大地节省劳动。
*/
[xiaoming doHomework:@"Math" WithSpeed:@"Fast"];
/*
前面定义方法时也许你就注意到了:
方法名是可以被拆开的,方法名写到一半,传个参数,再写到一半,再传参数。
这种奇葩设计的优点是(对于英语好的童鞋)方法是做什么的一目了然;
缺点是方法名太特么长了,记不住啊!
相当于java或py的:
xiaoming.initWithNameWithScore("Xiaoming",95);
*/
}
return 0;
}
什么破玩意,媽淡想死了!
推荐文档:
Objective-C 编程语言官网文档翻译
Start Developing iOS Apps Today
OC的 Kids Coding
苹果官方的示例代码
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。