在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
上一篇已经介绍了App Delegate、View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较。这一篇文章,我准备为大家介绍一下奇葩的Objective-C语言的语法和使用。这篇文章主要讲Objective-C的理论概念。 2.学习目标2.1 Objective-C语言面向对象的特性与C++类比学习,声明定义一个MyObject类,并创建这个类的实例。 2.2 Objective-C语言常见语法概念概览介绍类,方法,分类,扩展,协议,消息机制,动态特性selector,block,ARC等概念 本文关于Objective-C整理总结的内容比较多,不需要完全掌握,混个眼熟就成。 3.奇葩的Objective-C语言1)对于已经有开发经验的开发者而言,初次接触Objective-C的时候觉得根本不能接受,甚至有种畏惧,oc奇葩的语法简直颠覆了自己的世界观,因为出现了莫名其妙的符号,如, + - [ ]。但是,不要怕,我们慢慢来了解这到底是毛线。从名字即可看出,Objective-C是一个面向对象的编程语言,也就是它具有继承、封装、多态的语言特性。 2)那对于没有任何编程语言的童鞋,如何理解面向对象的编程呢? 对于没有任何编程经验的童鞋,我想这样解释,要弄清楚两个问题:i)编程到底在做什么?ii)什么是面向对象的编程? i)通俗的语言讲,编程就是在和计算机说话,用计算机明白的语言跟他交流,让他帮你做事。(就好像你跟外国人交流一样,你想跟人家交朋友,总得用人家懂得语言吧~) ii)“面向对象编程”,首先只是一个名词,实质是一种抽象的概念,主要是将一类待处理的数据及数据对应的操作集合化,写(封装)在一起。比如,一个人的属性有,身高、体重、年龄、性别,人可以做的事情有吃饭、睡觉、打豆豆~所有具有这些特征的都可以称之为人这一类。这便是面向对象的编程。(如果看到这里还不明白,那还是要多写程序,慢慢接受了新的概念有了固化的思维模式,就能理解并应用了) 学习的时候可以多种语言比较学习。我选择用C++和Objective-C进行类比,来声明定义一个MyObject类,比较异同点,了解各自面向对象编程的方法。(为何选择C++?因为,1.C++有指针的概念;2.C++是面向对象的语言。另,指针就是内存的地址。) 3.1 先看一下C++中声明定义类是如何编写的3.1.1 C++程序源码#include <iostream> using namespace std; class MyObject { public: MyObject(); ~MyObject(); void display(); void setValue(int x); int getIndex(); int getKey(); static void classMethod(); private: int index; int key; }; MyObject::MyObject() { cout<<"construct"<<endl; } MyObject::~MyObject() { cout<<"destruct"<<endl; } void MyObject::setValue(int x) { this->index = x; this->key = 1<<(x+2); } void MyObject::display() { cout<<"index == "<<this->index<<endl; cout<<"key == "<<this->key<<endl; } int MyObject::getKey() { return this->key; } int MyObject::getIndex() { return this->index; } void MyObject::classMethod() { cout<<"this is static (or class) method"<<endl; } int main(int argc, const char * argv[]) { // insert code here... std::cout << "Hello, World!\n"; MyObject *object = new MyObject(); MyObject::classMethod(); object->setValue(3); object->display(); int c = object->getIndex() + object->getKey(); object->MyObject::~MyObject(); printf("c = %d\n", c); MyObject object2; object2.setValue(2); object2.display(); return 0; } 3.1.2 控制台打印信息Hello, World! construct this is static (or class) method index == 3 key == 32 destruct c = 35 construct index == 2 key == 16 destruct Program ended with exit code: 0 3.1.3 代码解释:以上代码利用C++声明定义了MyObject类 1)定义了公有方法方法:
2)定义了私有成员变量:
3.1.4 特别注意
3.2 再看一下Objective-C是如何定义一个MyObject类的3.2.1 创建新项目选择OS X中的Command Line Tool,创建好工程后,按住command+N键创建Cocoa Touch Class,创建一个名为MyObject的NSObject的子类。 这样就创建了OS X的命令行程序,以用于简单演示如何声明定义Objective-C的类 3.2.2 程序源码1)main.m文件: #import <Foundation/Foundation.h> #import "MyObject.h" int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); MyObject *object = [[MyObject alloc] initWithIndex:3]; [object display]; // object = nil; } return 0; } 2) MyObject.h #import <Foundation/Foundation.h> @interface MyObject : NSObject - (instancetype)initWithIndex:(NSInteger)index; - (void)display; + (void)classMethod; @end 3) .m文件 #import "MyObject.h" @interface MyObject() @property (assign, nonatomic) NSInteger index; @property (assign, nonatomic) NSInteger key; @end @implementation MyObject @synthesize index = _index; @synthesize key = _key; - (instancetype)initWithIndex:(NSInteger)index { self = [super init]; if (self) { NSLog(@"init"); self.index = index; } return self; } - (void)setIndex:(NSInteger)index { _index = index; self.key = 1<<(index+2); } - (NSInteger)index { return _index; } - (NSInteger)key { return _key; } - (void)display { NSLog(@"index == %ld \n key == %ld", (long)_index, (long)_key); } + (void)classMethod { NSLog(@"this is static (or class) method"); } - (void)dealloc { NSLog(@"dealloc"); } @end
3.2.3 控制台打印结果2016-01-10 17:55:50.401 CompileOC[20792:1052939] Hello, World! 2016-01-10 17:55:50.402 CompileOC[20792:1052939] init 2016-01-10 17:55:50.402 CompileOC[20792:1052939] index == 3 key == 32 2016-01-10 17:55:50.402 CompileOC[20792:1052939] dealloc Program ended with exit code: 0 3.2.4 代码解释 1) 在main.m文件中创建了MyObject的实例并调用display方法。 2)在头文件中声明了三个公有方法, - (instancetype)initWithIndex:(NSInteger)index; - (void)display; + (void)classMethod; 3).m文件中
4)与C++代码做对比
4.Objective-C语言常见语法概念4.1 基本语法概念4.1.1类元素1)实例变量声明方法: @implementation { 实例变量是是类封装的数据 2)属性@property (特性) 类型 属性名; 属性是Objective-C提供的访问对象共享状态的机制,编译器可以自动生成访问实例变量的方法。Xcode自动创建的实例变量默认变量名为“_属性名” 3)类的声明(接口)@interface MyObject : NSObject @end 通用的如下: @interface 类名 : 父类名 @end 说明:
4)类的实现@implementation { //实例变量的声明 } //属性和方法的定义 @end 说明:
5)类的方法:分为类方法和实例方法
//code here return 返回值; }
说明:
说明:
6)类的扩展其实就是写在类.m文件中的接口,只不过与类.h中接口相比,在.m文件中声明的实例变量、属性、方法外部不能访问,即实现了方法、属性的私有化。例如MyObject.m文件中 @interface MyObject() @property (assign, nonatomic) NSInteger index; @property (assign, nonatomic) NSInteger key; @end 这段代码就是扩展,并且声明的index和key属性外部不能访问,只能在类的内部访问。 7)分类分类的目的主要是为了扩展类的方法,比如MyObject类我添加一个NY的分类,创建方法如下:
#import "MyObject.h" @interface MyObject (NY) @end
#import "MyObject+NY.h" @implementation MyObject (NY) @end 说明:
/Users/.../CompileOC/CompileOC/MyObject+NY.m:10:1: Duplicate interface definition for class 'MyObject'
8)协议
@protocol NYProtocol <NSObject> @optional - (void)nyOptionalProtocalMethod; @required - (void)nyRequiredProtocalMethod; @end 通用: @protocol 协议名 <NSObject> @optional //可选择实现的方法 @required //必须实现的方法 @end
@interface MyObject() <NYProtocol> @property (assign, nonatomic) NSInteger index; @property (assign, nonatomic) NSInteger key; @end 说明:
4.2 ARC(Automatic Reference Counting)自动引用计数ARC是Objective-C提供的内存管理方式,系统根据对象被引用的次数计次,当引用计数为零时,自动释放该对象所占有的内存。而非系统自动管理内存的方式,称为MRR(Manual Retain Release),老的项目代码中仍会有手动管理内存的代码。你会看到 retain 、 release、 autorelease 、dealloc这样的消息(方法)代码,以用来管理内存。但是在ARC模式下并不能手动编写这些代码,当引用一个对象时,即这个对象引用计数加一,当这个对象中某个指针,例如,本文中的 object = nil 时,引用计数减一,引用计数为零时,系统自动释放对象所占用的内存。 但在Xcode5之后,创建项目时无法限定非ARC模式,而且「基本现在开发的项目都使用ARC」,所以,对于初学者来说,手动内存管理就暂时不需要更深入的了解了。但如果,希望能实现ARC与MRR的混编译,那么就需要在Targets的Build Phases选项下Compile Sources下选择要不使用ARC编译的文件,双击它,输入 5.小结本篇文章主要介绍了 Objective-C 的基本语法,希望初学者读完之后能对 Objective-C 编程语言有一点基本的了解,打消一部分 Objective-C 这种陌生的编程语言的畏惧感,从而能继续往下学。 关于学习的方法,我还想说几句。我认为,人接触新鲜事物总会有种恐惧感,适当的恐惧感反而会更有意思,恐惧感太强烈会阻碍接受新的概念。接受新观念肯定是需要一定时间,因为原有的观念已经给思维产生一个定式,新观念可能和旧观念有冲突的地方,但肯定两者之间也存在一定联系。找出两者的共同点,能快速理解新概念。所以,我觉得学习一种新事物,首先要接受,慢慢的就适应了,不急~咱还年轻~ 6.博文推荐http://blog.csdn.net/kesalin/article/details/8155245 7.结语十分感谢萌萌哒乐乐(https://medium.com/@HiSuneBear)给我提的排版建议及文章评价,让我有更强烈的动力把文章写好(这篇文章写的太长,截至2016-01-11 17:41:55 我写了快三天。所以,最后有点累,不想写了,但是乐乐童鞋让我的小宇宙又重新燃了? 决心要把这篇文章拉回正轨~~)。另外,也十分感谢 @朱不鸣 @D 两位小童鞋对文章的批评建议~我会努力把文章写好,希望能给更多的人帮助,谢谢! 最后,预告一下接下来的文章内容:
敬请期待吧? ~ |
请发表评论