刚接触 iOS
开发,做为菜鸟,感受知识点是很多的,有必要进行整理。这里暂时只说针对iPhone的开发吧,iWatch神马的……html
先说Objective-C
吧,虽然Apple发布了Swift
,不过在2.0
版本或者更稳定的版本发布以前,仍是老老实实学OC
吧。java
在官网或Mac App Store下载XCode就好了,感受不像安卓那样麻烦,一切都配置好了,略去不讲。若是新建Project,会左侧边栏发现有iOS和OS X两种类型的app能够建立。左侧不少不明觉厉的东西。若是纯粹要练习OC
基础,能够选择建立Command Line Tool
,若是建立单页应用能够选择Single Page App
,等等。python
按照我我的的理解,Cocoa之于iOS/OS X就至关于.NET Framework之于Windows。Cocoa里有两个框架对于iOS开发来讲很是重要:Foundation Kit
和 UIKit
,若是是构建OS X Application
,你还须要用到AppKit
。ios
Foundation Kit
是后二者的基础:它提供了Objective-C
不少基础的类型。而Foundation
又是基于CoreFoundation
的,这是用纯C语言写的框架。git
若是你在编程中看到类型名、方法名、对象名以NS
前缀(如NSString
类型),那么它就是存在于Foundation
中,若是以CF
为前缀,它就存在于CoreFoundation
中。参考下图:github
说得不太清楚,反正之后都会接触到,你能够不用在乎这些细节。objective-c
OC
只是在C
的基础上进行了一些扩展,所以,OC
是能够直接写C
的方法的,有时候还能够写C++
,称为Objective-C++
。编程
按照惯例了来一段:api
// main.m #import <Foundation/Foundation.h> int main(int argc,const char *argv[]) { @autoreleasepool{ NSLog(@"Hello,World!"); } return (0); }
分析:app
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
苹果官方的示例代码