资讯专栏INFORMATION COLUMN

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

peixn / 2147人阅读

摘要:按照惯例了来一段分析文件不是保存为而是保存为格式的,头文件扩展名则不变。入口程序,为启动时接受的命令行参数,这个不用多说。这个字符在开发中非常常见,它代表这是一个语法。顾名思义是完成初始化。

刚接触 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中。参考下图:

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

Objective-C小试牛刀

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

Hello World

按照惯例了来一段:

// main.m
#import 

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

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

  return (0);
}

分析:

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

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

入口程序:mainargc 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 

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/15795.html

相关文章

  • iOS学习笔记 Objective-C (二)

    摘要:和或中的相同,代表空对象,并不会存在于内存中,所以当时,指针将不会指向内存中的任何一个区域。和在使用上是没有严格限定的,它们俩可以相互替代。另外还有权限变量在框架内为,对于框架外则是私有的。 上一篇文章 结尾草草地写了这么个Demo:定义一个Student类,实例化出一个xiaoming的对象,并同时使用python和java与Objective-C实现它们。这段代码只是演示了一些最...

    Benedict Evans 评论0 收藏0
  • iOS学习笔记 Objective-C (三)

    摘要:它有和两个值,顾名思义。当然也提供了长度可变的相应类型,后者一般是前者的子集,例如。另一个问题就是,不能将加入数组,因为这代表数组到此结束,如果需要加入一个空对象,请使用。但后者的缺点是不能对数组成员进行修改删除操作,否则编译器将报错。 这篇文章我们讲讲 OC 中的类型。 上一篇文章已经说了,OC是对C的扩展,因此可以直接使用C中的类型: long l; int i; float...

    shiguibiao 评论0 收藏0
  • iOS 学习参考资料

    摘要:开发马上着手开发应用程序苹果官方入门资料,也有的英文版。官方的文档库,也是最靠谱的资料了,在中也可以下载后直接查阅。当时我看的是的版本,也建议任何学习资料要看要以后版本的,因为其引入了,在内存管理方面和以前的方式有很大的不同。 编程语言 Programming with Objective-C: About Objective-C : Apple 撰写的一份关于 Objective-...

    张迁 评论0 收藏0
  • SegmentFault 技术周刊 Vol.7 - iOS丨好好学习,从娃抓起~

    摘要:最近,阿温家小娃出生,让他当了一回公司的热议人物。还在高速,结果娃已经阿温突然在群里发了言,打破了公司群的宁静。儿子比手机先到啊阿温先生紧接着又发了个言,原来本该月中旬出生的娃,提前来到了这个世界。 showImg(https://segmentfault.com/img/remote/1460000007021306?w=690&h=295); 我有一程序员朋友阿温,92 年,高个子...

    bluesky 评论0 收藏0
  • iOS 学习资料整理(上)

    摘要:看到一份很赞的学习资料,由于文章字数限制,分两篇分享原文学习资料整理这份学习资料是为初学者所准备的旨在帮助初学者们快速找到适合自己的学习资料节省他们搜索资料的时间使他们更好的规划好自己的学习路线更快的入门更准确的定位的目前所处的位置该文档会 看到一份很赞的IOS学习资料,由于SF文章字数限制,分两篇分享 原文 iOS 学习资料整理 这份学习资料是为 iOS 初学者所准备的, 旨在帮助...

    church 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<