第一篇 Object-C快速入门
一、概述
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快速入门相关推荐
- 《Ansible权威指南 》一 第一篇 Part 1 基础入门篇
本节书摘来自华章出版社<Ansible权威指南 >一书中的第1章,第1.1节,李松涛 魏 巍 甘 捷 著更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第一篇 ...
- .NET Core实战项目之CMS 第六章 入门篇-Vue的快速入门及其使用
写在前面 上面文章我给大家介绍了Dapper这个ORM框架的简单使用,大伙会用了嘛!本来今天这篇文章是要讲Vue的快速入门的,原因是想在后面的文章中使用Vue进行这个CMS系统的后台管理界面的实现.但 ...
- .NET Core实战项目之CMS 第五章 入门篇-Dapper的快速入门看这篇就够了
写在前面 上篇文章我们讲了如在在实际项目开发中使用Git来进行代码的版本控制,当然介绍的都是比较常用的功能.今天我再带着大家一起熟悉下一个ORM框架Dapper,实例代码的演示编写完成后我会通过Git ...
- JAVA程序设计-头歌实训-------# 第一阶段 Java语言快速入门
第一阶段 Java语言快速入门 第1关:Java程序的基本框架:Hello Java World! 任务描述 本关的任务是编写你人生中第一个Java程序,从此开启你的Java实训之旅,显示效果如下: ...
- 牛客网刷题之SQL篇:非技术快速入门39T
导航 前序 一.简单的关键字练习 1-10 二.知识点复习之 ==运算符== 1.算数运算符 2.比较运算符 3.逻辑运算符 4.位运算符 三.10-28T 0.简单题总结 1. SQL18 ==分组 ...
- .NET Core实战项目之CMS 第四章 入门篇-Git的快速入门及实战演练
写在前面 上篇文章.NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入我带着大家通过分析了一遍ASP.NET Core的源码了解了它的启动过程,然后又带着大家熟悉了一遍配置文 ...
- jquery easyUI第一篇【介绍、入门、使用常用的组件】
tags: web前端库 什么是easyUI 我们可以看官方对easyUI的介绍: easyUI就是一个在Jquery的基础上封装了一些组件....我们在编写页面的时候,就可以直接使用这些组件...非 ...
- 第一阶段:JAVA快速入门
文章目录 1 第一阶段 java入门 1.1 java快速入门及第一个程序 1.1.1 java的特性和优势 1.1.2 java应用程序的运行机制 1.1.3 JVM.JRE和JDK 1.1.4 j ...
- 『Python开发实战菜鸟教程』实战篇:爬虫快速入门——统计分析CSDN与博客园博客阅读数据
文章目录 0x01:引子 首先介绍一下网络爬虫是什么,可以用来做什么? 这里简单探讨一下网络爬虫的合法性 正式进入爬虫实战前,需要我们了解下网页结构 HTML CSS JScript 写一个简单的 H ...
- Shiro第一个程序:官方快速入门程序Qucickstart详解教程
目录 一.下载解压 二.第一个Shiro程序 1. 导入依赖 2. 配置shiro配置文件 3. Quickstart.java 4. 启动测试 三.shiro.ini分析 四.Quickstart. ...
最新文章
- 腾讯国风AI虚拟人学会作诗书法,背靠开源模型SongNet
- 2020年人工神经网络第二次作业-参考答案第一题
- java swing最小化_Java swing 窗口最小化到任务栏 点击右键显示菜单(复制代码即可运行查看效果)...
- java oca_OCA第1部分中的Java难题
- vue变量传值_VUE 学习——父组件传值给子组件
- intelx79服务器芯片组,Intel X79芯片组下月开始供货
- 数据结构思维 第九章 `Map`接口
- 修改ftp服务器用户,通过批处理修改FTP账号和密码
- 云计算遇上区块链,会产生怎样的能量和火花?
- java opencv教程_史上最全 java 集成 opencv 教程
- java中滚动字幕做法_四种滚动字幕的方法
- android安卓-子线程计时器TimeCountThread-时分秒-实用功能系列
- 用友 hr win10 java_用友u8win10安装教程_用友u8win10安装方法步骤教程_用友u8安装教程...
- win7搭建nas存储服务器_FreeNas 0.7.1:普通电脑变成网络存储服务器
- php面试题之三——PHP语言基础(基础部分)
- 蓝桥杯第八届省赛 电子钟 by YYC
- 三十岁那年,我的梦想是年薪十万
- tianchai 12023 水管工游戏(DFS搜索)
- Android自定义控件之实现快速检索
- 导入Excel至数据库中 外部表不是预期格式错误信息