oc精简笔记
首先如果是想在终端学习的话,以下内容是必须的,如果是直接使用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);