一、概述

Object-C是OS X和iOS上的主要程序开发语言。它是C语言的超集,提供了面向对象和动态运行时(多态)的功能。Object-C继承了C语言的语法、基本类型和流程控制语句,同时添加了定义类和方法的语法。当进行动态类型识别和绑定的时候,Object-C还添加了对象结构管理和对象语法的语言层面的支持,将很多工作延迟到了运行时进行处理。

二、类的声明与实现

Object-C类声明,一般在一个独立的头文件中进行,比如声明一个名称为yourClass的类的一般格式如下:

@Interface yourClass :NSObject
...
@end

NSObject是Object-C中所有类的根类,也就是说,所有类要么从它派生,要么从它的子类派生。但你一次只能从一个类派生,因为Object-C是单继承的。

yourClass类的实现一般在yourClass.m文件中,其一般格式为:

#import  “yourClass.h“
@implementation yourClass
...
@end

#import,它类似C语言的#include。只不过,在Object-C中,它比#include更好用,它可以防止重复包含。也就说#inlcude依然可以使用,但#import更好。

三、属性

1、属性的声明与修饰

属性就是对象的数据。属性使用@property关键字声明。一般格式如下:

@property NSString *firstName;
@property NSString *lastName;

多个属性之间,可以使用逗号分隔:

@property (strong, nonatomic) UIWindow *window;

属性通常还会加一些修饰,来控制数据的访问和存储等:

@property  (readonly)  NSString *firstName;
@property  (readonly)  NSString *lastName;

readonly与readwrite:

readonly表明该属性是只读的,外部不能修改其值。与readonly相对的修饰是readwrite,但你不必把它写出来,因为它是默认的。

atomic与nonatomic:

(atomic、nonatomic)属性用于多线程编程,属性默认是atomic的。在多线程环境下设置为atomic可以保证数据读取的一致性(因为,它将保证数据仅仅被一个线程独占。也就是说一个线程进行写操作时,将锁定该属性,不允许其他的线程进行写操作。)由于该操作会对数据进行锁操作,故会消耗较多的资源。所以在不需要进行多线程操作时建议将该属性设置为nonatomic,设置为该参数时程序在任何情况都不会锁定该属性。

strong与weak:

其中strong是默认的。strong表示该属性对其相应的对象是强引用。一个变量保持对一个对象的强引用,只要该变量在其作用域范围内或者直到它被赋给另一个对象或者nil为止。weak表示对属性对应的对象的弱引用。

copy、assign、retain:

copy修饰表示该属性将使用强引用,因为它必须保持它创建的新对象。

assign指定setter方法用简单的赋值,不更改索引计数(Reference Counting),一般对简单数据类型 使用assign。

retain,对象引用计数加一。

2、属性的存取方法

一般情况下,一旦你使用@property声明了一个属性,编译器就会自动为该属性生成一对存取方法。编译器生成的存取方法遵守以下命名约定:

1)用来访问属性值的方法,getter方法,其名字与属性的名字是相同的;

2)用来设置属性值的方法,setter方法,其名字以“set”开始,其后是属性名,属性名首字母大写;

属性的修饰也会告诉编译器如何生成相关的存取方法,对于readonly属性,编译器会生成getter方法,但不会生成setter方法。

你也可以为存取方法取一个你自己想要的名字:

@property (getter=isFinished) BOOL finished;
@property (readonly, getter=isFinished)BOOL finished;

除了明确调用存取方法之外,OC还提供了点语法,来访问对象的属性:

NSString *firstName = somePerson.firstName;
somePerson.firstName = @"Johnny";

点语法只是存取方法调用的一个便捷方式。当你使用点语法的时候,属性依然是通过getter或者setter方法来访问或者改变的。

点语法访问属性,同样要受到属性修饰的约束。

3、属性与实例变量

默认地,一个可读写的属性是基于一个实例变量的,这个实例变量也是编译器自动生成的。

自动生成的实例变量与属性的名字是相同的,但是多了一个下划线前缀。

尽管一个对象通过存取方法或者点语法访问自己的属性是最佳做法,但是它也可以在类实现中的,任何实例方法中,直接访问该属性对应的实例变量。下划线前缀清晰地表明你正在访问一个实例变量,而不是一个局部变量:

- (void)someMethod {NSString *myString = @"An interesting string";_someString = myString;
}

一般而言,你应该使用存取方法或者点语法来访问属性,即使你是在它自己的类实现中访问其属性,在这种情况下,你需要使用self:

- (void)someMethod {NSString *myString = @"An interesting string";self.someString = myString;// or[self setSomeString:myString];
}

self在object-c中代表当前实例。这个规则的例外会出现在当你写初始化、释放内存或自定义存取方法的时候。

四、对象与方法

1、方法

在Object-C中,有两种类型的方法,类方法和实例方法。

类方法以+开头,其基本形式如下:

+ (id)someMethod;

类方法一般都是工厂方法,返回一个实例。

实例方法以-开头,其基本形式如下:

- (void)someMethod;

方法可以不带参数,也可以带一个或多个参数,也可以有返回值:

- (int)someMethod;
- (void)someMethodWithValue:(SomeType)value;
- (void)someMethodWithFirstValue:(SomeType)value1  secondValue:(AnotherType)value2;

2、对象的创建与初始化

Object-C的对象的内存都是动态分配的,所以要使用指针来记录一个对象。

NSObject根类提供了一个类方法,alloc,用来为对象动态分配内存:

+ (id)alloc;

注意该方法的返回值是一个id类型,它表示指向一个对象的指针。

alloc方法还有一个重要的任务,就是清理分配给对象属性的内存,通过将其置为0。也就是说会它会帮你初始化对象的属性。

与+ (id)alloc对应的就是- (void) dealloc,它用来释放对象的内存,自动引用计数ARC会自动调用该函数,而不用我们手动调用。

NSObject还提供了对象的初始化方法:

- (id)init;

这是一个实例方法。在init函数中你可以为对象的属性赋予合适的初值。

与- (id)init对应的是- (void) release,调用该函数会使得对象的引用计数-1,引用计数为0的话呢,ARC就会调用- (void) dealloc释放掉对象的内存。

3、消息

对象可以发送和接受消息,一个对象通过调用该对象的一个方法发送一个消息给另一个对象。这是object-C的说法,说白了就是函数调用。

对象发送消息的最常见形式如下:

[someObject doSomething];
[someObject doSomething: someValue];

对象可以给自己发送消息:

[self saySomething:@"Hello, world!"];

对象可以调用其父类实现的方法:

[super saySomething:@"Hello, world!"];

五、类扩展

类扩展一般在实现文件的最上部实现,用于扩展类的内部实现。

你可以在类扩展中声明一个属性:

@interface yourClass ()
@property someType someProperty;
@end

在类扩展中声明的属性,编译器同样会为其生成相关的存取方法和实例变量。但是它只能在类的实现内部进行访问。

你也可以声明一个实例变量(不是属性的实例变量):

@interface yourClass ()
{someType someValue;
}
@end

这个实例变量也只能在类的实现内部访问。

你还可以在类扩展中声明方法:

@interface yourClass () -(void)someMethod;@end

这个方法需要在类实现中进行实现,并且只能在类实现中进行调用。
综合起来,.m文件的基本格式如下:

#import  “yourClass.h“
@interface yourClass ()
{someType someValue;
}
@property someType someProperty;
-(void)someMethod;
@end

一些需要注意的问题,有一些上面提到过,再过一遍吧:

1、程序的头文件和源文件的扩展名分别为.h 和.m;

2、注释:单行(//)和多行(/* … */);

3、Object_C 中的nil 相当于NULL。

4、Object_C 中的YES 和NO 相当于true 和false。

5、#import相当于#include ,导入头文件也有两种查找方式< … > 和" … ",但是#import 可自动防止同一个文件被导入多次。

6、Object_C中的所有类都必须继承自NSObject。

7、Object_C仅支持单一父类继承,不支持多重继承。

8、Object_C中所有对象都是指针的形式。

9、Object_C用self代替this。

10、Object_C使用id代替void*。

11、Object_C中用消息表示类的方法,并采用[aInstance method:argv]调用形式。

12、Object_C支持反射机制。

13、Object_C支持Dynamic Typing,Dynamic Binding和Dynamic Loading。

本篇知识点回顾:

1、了解OC语言的基本特性;

2、掌握类的声明、实现;

3、掌握属性的声明和修饰;

4、掌握对象的创建和方法的声明及实现。

第一篇 Object-C快速入门相关推荐

  1. 《Ansible权威指南 》一 第一篇 Part 1 基础入门篇

    本节书摘来自华章出版社<Ansible权威指南 >一书中的第1章,第1.1节,李松涛 魏 巍 甘 捷 著更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第一篇 ...

  2. .NET Core实战项目之CMS 第六章 入门篇-Vue的快速入门及其使用

    写在前面 上面文章我给大家介绍了Dapper这个ORM框架的简单使用,大伙会用了嘛!本来今天这篇文章是要讲Vue的快速入门的,原因是想在后面的文章中使用Vue进行这个CMS系统的后台管理界面的实现.但 ...

  3. .NET Core实战项目之CMS 第五章 入门篇-Dapper的快速入门看这篇就够了

    写在前面 上篇文章我们讲了如在在实际项目开发中使用Git来进行代码的版本控制,当然介绍的都是比较常用的功能.今天我再带着大家一起熟悉下一个ORM框架Dapper,实例代码的演示编写完成后我会通过Git ...

  4. JAVA程序设计-头歌实训-------# 第一阶段 Java语言快速入门

    第一阶段 Java语言快速入门 第1关:Java程序的基本框架:Hello Java World! 任务描述 本关的任务是编写你人生中第一个Java程序,从此开启你的Java实训之旅,显示效果如下: ...

  5. 牛客网刷题之SQL篇:非技术快速入门39T

    导航 前序 一.简单的关键字练习 1-10 二.知识点复习之 ==运算符== 1.算数运算符 2.比较运算符 3.逻辑运算符 4.位运算符 三.10-28T 0.简单题总结 1. SQL18 ==分组 ...

  6. .NET Core实战项目之CMS 第四章 入门篇-Git的快速入门及实战演练

    写在前面 上篇文章.NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入我带着大家通过分析了一遍ASP.NET Core的源码了解了它的启动过程,然后又带着大家熟悉了一遍配置文 ...

  7. jquery easyUI第一篇【介绍、入门、使用常用的组件】

    tags: web前端库 什么是easyUI 我们可以看官方对easyUI的介绍: easyUI就是一个在Jquery的基础上封装了一些组件....我们在编写页面的时候,就可以直接使用这些组件...非 ...

  8. 第一阶段:JAVA快速入门

    文章目录 1 第一阶段 java入门 1.1 java快速入门及第一个程序 1.1.1 java的特性和优势 1.1.2 java应用程序的运行机制 1.1.3 JVM.JRE和JDK 1.1.4 j ...

  9. 『Python开发实战菜鸟教程』实战篇:爬虫快速入门——统计分析CSDN与博客园博客阅读数据

    文章目录 0x01:引子 首先介绍一下网络爬虫是什么,可以用来做什么? 这里简单探讨一下网络爬虫的合法性 正式进入爬虫实战前,需要我们了解下网页结构 HTML CSS JScript 写一个简单的 H ...

  10. Shiro第一个程序:官方快速入门程序Qucickstart详解教程

    目录 一.下载解压 二.第一个Shiro程序 1. 导入依赖 2. 配置shiro配置文件 3. Quickstart.java 4. 启动测试 三.shiro.ini分析 四.Quickstart. ...

最新文章

  1. 腾讯国风AI虚拟人学会作诗书法,背靠开源模型SongNet
  2. 2020年人工神经网络第二次作业-参考答案第一题
  3. java swing最小化_Java swing 窗口最小化到任务栏 点击右键显示菜单(复制代码即可运行查看效果)...
  4. java oca_OCA第1部分中的Java难题
  5. vue变量传值_VUE 学习——父组件传值给子组件
  6. intelx79服务器芯片组,Intel X79芯片组下月开始供货
  7. 数据结构思维 第九章 `Map`接口
  8. 修改ftp服务器用户,通过批处理修改FTP账号和密码
  9. 云计算遇上区块链,会产生怎样的能量和火花?
  10. java opencv教程_史上最全 java 集成 opencv 教程
  11. java中滚动字幕做法_四种滚动字幕的方法
  12. android安卓-子线程计时器TimeCountThread-时分秒-实用功能系列
  13. 用友 hr win10 java_用友u8win10安装教程_用友u8win10安装方法步骤教程_用友u8安装教程...
  14. win7搭建nas存储服务器_FreeNas 0.7.1:普通电脑变成网络存储服务器
  15. php面试题之三——PHP语言基础(基础部分)
  16. 蓝桥杯第八届省赛 电子钟 by YYC
  17. 三十岁那年,我的梦想是年薪十万
  18. tianchai 12023 水管工游戏(DFS搜索)
  19. Android自定义控件之实现快速检索
  20. 导入Excel至数据库中 外部表不是预期格式错误信息

热门文章

  1. Android面试准备20190422
  2. excel vba移位运算
  3. IPTV在线服务器地址,德芯IPTV网关服务器,德芯直播点播服务器
  4. Vivado HLS教程
  5. Thor HTTP 抓包嗅探分析接口调试网络协议
  6. uniapp使用阿里icon详细步骤
  7. C++11线程安全的单例模式
  8. plsqldev显示语言有问题
  9. 嵌入式UWB定位测距设备开发实战(7)硬件之天线选型
  10. ubuntu开机自启vnc虚拟显示器并使用向日葵远程连接