iOS学习笔记之 Objective-C (一)

刚接触 iOS 开发,做为菜鸟,感受知识点是很多的,有必要进行整理。这里暂时只说针对iPhone的开发吧,iWatch神马的……html

工具和语言

先说Objective-C吧,虽然Apple发布了Swift,不过在2.0版本或者更稳定的版本发布以前,仍是老老实实学OC吧。java

使用官方的IDE——XCode

在官网或Mac App Store下载XCode就好了,感受不像安卓那样麻烦,一切都配置好了,略去不讲。若是新建Project,会左侧边栏发现有iOS和OS X两种类型的app能够建立。左侧不少不明觉厉的东西。若是纯粹要练习OC基础,能够选择建立Command Line Tool,若是建立单页应用能够选择Single Page App,等等。python

什么是Cocoa?

按照我我的的理解,Cocoa之于iOS/OS X就至关于.NET Framework之于Windows。Cocoa里有两个框架对于iOS开发来讲很是重要:Foundation KitUIKit,若是是构建OS X Application,你还须要用到AppKitios

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

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

1350459010_4309.jpg

说得不太清楚,反正之后都会接触到,你能够不用在乎这些细节。objective-c

Objective-C小试牛刀

OC只是在C的基础上进行了一些扩展,所以,OC是能够直接写C的方法的,有时候还能够写C++,称为Objective-C++编程

Hello World

按照惯例了来一段:api

// main.m
#import <Foundation/Foundation.h>

int main(int argc,const char *argv[])
{

  @autoreleasepool{
    NSLog(@"Hello,World!");
  }

  return (0);
}

分析:app

  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
苹果官方的示例代码

相关文章
相关标签/搜索