刚接触 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 KitUIKit,如果是构建OS X Application,你还需要用到AppKit

Foundation Kit是后两者的基础:它提供了Objective-C很多基础的类型。而Foundation又是基于CoreFoundation的,这是用纯C语言写的框架。

如果你在编程中看到类型名、方法名、对象名以NS前缀(如NSString类型),那么它就是存在于Foundation中,如果以CF为前缀,它就存在于CoreFoundation中。参考下图:

1350459010_4309.jpg

说得不太清楚,反正以后都会接触到,你可以不用在意这些细节。

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);
}

分析:

  1. OC文件不是保存为*.c而是保存为*.m格式的,头文件扩展名则不变。

  2. 首先要导入 Foundation.h,也就是前文中提到的Foundation Kit框架的头文件。但它使用了关键字import而不是我们熟知的include,前者可以防止重复引用问题,后者则需要一些宏代码配合。如果需要导入的文件在Cocoa中,则用<>,如果在项目中,用""

  3. 入口程序:mainargc argv为启动时接受的命令行参数,这个不用多说。

  4. @autoreleasepool内存“自动释放池”,在这个“池子”里,系统可以自动为创建的对象分配或移除内存,与这个有关的知识是内存管理和自动引用计数。

  5. NSLog命令行的打印方法,使用起来和printf 差不多。

  6. @"Hello,World!",前面加@代表这是一个Objective-C字符串(NSString类型),如果不加则和普通C字符串无异。但99%的情况下,我们使用NSString

  7. @这个字符在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
苹果官方的示例代码


仅愚
484 声望7 粉丝