oc精简笔记

时间:2022-09-24 20:39:02

首先如果是想在终端学习的话,以下内容是必须的,如果是直接使用xcode的请随意:

operating system      os       X

ter   终端的缩写

ls      显示目录文件夹(Linux命令)

cc-c   编绎(Linux命令)

mkdir   建立一个新的子目录(命令)

fraction  分数   ;denominator       分母    ;numerator   分子

foundation   基础;   NSobject:Nextstep object的缩写

inheritance  继承  ; interface 接口

  • variable  变量  ;instance  实例

SEL:选择器数据类型

block:  代码块数据类型

framework  :工作空间

注意:

%i和%d都是表示有符号十进制整数,但%i可以自动将输入的八进制(或者十六进制)转换为十进制,而%d则不会进行转换。

巧记:

醋(初等比如 ()、->、等)

坛(单目运算符如!、~、++等)

酸(算数运算符如*、%等)

味(位移)

灌(关系运算符)

味(&按位与、^按位或)

落(逻辑运算符  逻辑与等)

跳(条件比如  :?:)

福(赋值)

C语言中:

计算c=b+++a;时,先把b的值赋给c,b再加一,然后再加 a

计算c=++b+a;时,先把b加一,再把b的值赋给c,然后再加 a

Object-C:

@autoreleasepool   自动释放池跟,与内存管理有关,以后 写代码都写在@autoreleasepool中

@try {//可能出错的代码块}@catch{一旦出错了可以补救的代码@finally{//无论出错不出错都会执行的代码}

注释补丁vvDument- xcode  在GitHub网站下载

@methodeclaration   方法声明(method 方法)

@implementation   设计实现

parameter      参数

statement :陈述、声明

类和对象:类是对无数个对象的相同属性的概括,相当于现实中的图纸

类的设计规范:

1、类名的第一个字母必须是大写

2、不能有下划线

3、多个英文单词用驼峰标识(英文单词首字母要大写)

OC运行过程(终端命令控制):

touch :如果fileA存在,使用touch指令可更改这个文件或目录的日期时间,包括存取时间和更改时间;

如果fileA不存在,touch指令会在当前目录下新建一个空白文件fileA。

打开桌面: cd  Desktop

rm -rf dir1 删除一个叫做 'dir1' 的目录并同时删除其内容

rm -f file1 删除一个叫做 'file1' 的文件'

rmdir dir1 删除一个叫做 'dir1' 的目录'

cd .. 返回上一级目录

删除文件:rm   -f  文件名

创建文件: touch  文件名

1、编写oc源文件:.m   、.c

2、编绎: cc  -c  xxx..m   xxx.c       (注意空格)

3、链接:cc xxx.o  xxx.o   -framework  Foundation(只有用 了foundation 框架才需要加上-framework Foundation)

4、运行: ./a.out

5、编绎加运行:cc  xxx.m

OC类第一课:

#import<Foundation/Foundation.h>

//oc对象的本质就是结构体

//类的声明:

/*NSObject的目的是:让Car 这个类具备创建对象的能力*/

@interface Car : NSObject

{

//用来申明对象属性(实例变量/成员变量,默认会初始化为零)

int wheels  ;//车轮个数

int speed ; //时速、速度

}

//

@end

//类的实现:

@implementation Car

@end

int main()

{

/*在oc中,想执行一些行为,就写上中括号【行为执行者    行为名称】

利用类来创建对象

执行了Car这个类的new行为来创建新的对象

创建出一个新的对象,并且会返回对象本身(新对象的地址)*/

[Car new];

return 0;

}

在oc中数据类型的定义 与c语言的区别

1、 unsigned long  —>NSUInteger

2、 float —>  CGFloat

oc中方法的权限:

但是这里要注意的是:OC中的方法是没有修饰符的概念的,这个和Java有很大的区别,一般都是公开访问的,即public的,但是我们怎么做到让OC中的一个方法不能被外界访问呢?

OC中是这么做的,如果想让一个方法不被外界访问的话,只需要在.m文件中实现这个方法,不要在头文件中进行定义,说白了就是:该方法有实现,没定义,这样外界在导入头文件的时候,是没有这个方法的,但是这个方法我们可以在自己的.m文件中进行使用。

为什么要介绍这点知识呢?因为在后面我们会说到单利模式,到时候就会用到这个知识点了。

静态方法与实例方法

方法是类的行为,写在接口和实现两个文件中。在接口部分声明方法,在实现部分实现方法。

1、类方法与实例方法

Objective-C中的类可以声明两种类型的方法:实例方法和类方法。实例方法就是一个方法,它在类的一个具体实例的范围内执行。也就是说,在你调用一个实例方法前,你必须首先创建类的一个实例。而类方法,比较起来,也就是说,不需要你创建一个实例。

+表示类方法,就是类调用方法,不依赖与任何对象的方法,类似于c语言的static关键字 static函数。-表示是实例(对象)方法,只能是对象可调用,依赖与任何对象的方法。

总结一下几点:

(1)类(static)方法(便利构造器)

a. 类方法的调用

[类名称 类方法名称];

这里需要注意:

1、类方法可以调用类方法。

2、类方法不可以调用实例方法,但是类方法可以通过创建对象来访问实例方法。

3、类方法不可以使用实例变量。类方法可以使用self,因为self不是实例变量。

4、类方法作为消息,可以被发送到类或者对象里面去(实际上,就是可以通过类或者对象调用类方法的意思)。

(2)实例方法

a.实例方法的调用

首先需要实例化该类

例如:Human *man = [Human alloc] init];

[类的实例

实例方法名称];

例如:[man showSex];

注意:此处实例化该类时,调用了该类的构造函数init,并且该类的构造函数调用[super init]的返回值不等于该类的self。

定义子类的实例

Woman *wife = [Woman alloc] init];

此处实例化该类时,调用了该类的构造函数init,并且该类的构造函数调用[super init]的返回值 等于该类的self。

2、单例模式

Singleton模式,即单例模式。顾名思义,主要用于做应用程序的资源共享控制。实质为,单例是在程序声明周期里有且仅有被实例化过一次的类。为确保 实例化的唯一,利用类的类(static)方法来生成和访问对象。至此,我们可以在程序中任何地方访问类的单例对象,因为只实例化唯一的一次,所以,并不 用 alloc、init、autorelease初始化方法。

单例设计模式的要点:

(1) 某个类只能有一个实例。

(2)他必须自行创建这个对象

(3)必须自行向整个系统提供这个实例;

(4)这个方法必须是一个静态类;

.m文件代码(记住)

@implementation Singleton

static Singleton *st;

+(Singleton*) instance{//可用id代替返回可用的指针对象 instance是方法名

//静态变量,生命周期是整个程序,在下一次该函数调用时仍可使用 。?    if(st==nil ) {//指针为空就创建?         st = [[Singleton alloc] init];

//指针st指向单例模式 Singleton

}

return st;//不是空就继续使用

}

@end

注意:所谓单例,即我们自己创建一个单例类,该类只能生成唯一的对象,为了防止该对象被复制(copy)或者retain 和 release 等操作,我们必须在所创建的单例的实现文件( .m 文件)中将父类的这些方法给覆盖,该目的是为了保证单例模式的一个严谨性。

oc中的继承:

1、成员访问类型

private:私有成员,不能被外部函数访问(使用),也不能被子类继承;

protected:保护成员,不能被外部函数访问,可以被子类继承;

public:公有成员,可以被外部函数访问,也可以被子类继承。

OC中,所有的方法(消息),都是公有的。

2、重写(继承的另一部分)

子类可以从父类继承方法,但是有时候父类的方法不适合子类,子类就可以写一个自己的同名方法,覆盖掉父类的同名方法,叫做重写。

重写的时候,在子类的.h中不必重新声明,直接在.m中写实现就可以。

1 //父类声明文件

2 #import <Foundation/Foundation.h>

3 @interface Father : NSObject

4 -(void)run;

5 -(void)jump;

6 @end

7

8 //父类实现文件

9 #import "Father.h"

10 @implementation Father

11 -(void)run{

12     NSLog(@"he is running!");

13     return;

14 }

15 -(void)jump{

16     NSLog(@"father can jump 1.2m");

17 }

18 @end

1 //子类声明文件

2 #import "Father.h"

3

4 @interface Son : Father

5

6 @end

7

8 //子类实现文件

9 #import "Son.h"

10

11 @implementation Son

12 -(void)jump{

13      NSLog(@"he can jump 0.6m");

14 }

15 @end

其中,子类重写父类的jump方法,不需要重新声明。

同一个方法,不同的实现,称为多态。重写是多态的一种。

继承的好处:

  1)创建大量的相似类的时候,可以节省工作量。

  2)使用框架中的类,或已经写好的类,继承该类,生成一个派生类,比原类更好用。

注意:NSString、NSArray、NSDictionary都是不能够继承的。

3、虚方法

OC的方法都是虚方法

  1)父类的指针可以指向子类的对象

1 Son * son = [[Son alloc] init];

2 Father * p = son;

上面p和son都指向子类的对象;调用方法时,不看指针,看对象,对象的地址指向什么对象,就调用什么方法,称为虚方法。

  2)调用方法时,不看指针看对象,这样的方法叫做虚方法。虚方法的好处:可以描述不同事物被相同事件触发,产生不同的响应(结果)。

oc中的字符串

字符串的创建:

NSString *str1 = @"如果你们不好好学 ";//快速创建

//快速创建出的字符串内容 是常量, 在常量区内 所以指针相等

//使用类方法拼接出来的字符串是对象,所以指针地址不同

/*

NSString *s1 = [NSString stringWithFormat:@"字符串"];

NSString *s2 = [NSString stringWithFormat:@"字符串"];

if (s1 == s2) {

NSLog(@"s1 == s2");

} else {

NSLog(@"指针地址不相同");

}

1、   NSString *s1 = [[NSString alloc]initWithFormat:@"age is %d",10];

//c字符串 --->oc字符串

NSString *s1 = [[NSString alloc] initWithUTF8String:"yuan"];

//oc字符串 --->c字符串

const char *s2 = [s1 UTF8String];

// NSUTF8StringEncoding   用到中文就可以用这种编码

NSString *s5 = [[NSString alloc] initWithContentsOfFile:@"/Users/apple/Desktop/1.txt" encoding:NSUTF8StringEncoding error:nil];

/*

NSString :不可变的字符串

NSMutableString :可变的字符串

*/

前提:必须是可变的字符串

//必须要用NSMutableString 类来调用,否则都是错的

NSMutableString *s = [NSMutableString  stringWithFormat:@"i love you"];

//拼接字符串的方法 :

[s appendString:@"  sister"];

NSRange range = [s rangeOfString:@"love"];

//删 除某个范围内的字符串

[s deleteCharactersInRange:range];

//获取某段字符串的范围

NSRange r = [s rangeOfString:@"i"];

NSLog(@"%@",s);