ObjectiveC知识点总结_objectivec语法总结
ObjectiveC知识点总结由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“objectivec语法总结”。
/*
1.类是一组具有相同特性和行为的某一类事和物的集合.2.对象是类的实例化.3.计算机语言的目的:模拟和解决生活中的问题.4.#include和#import的区别? 答:(1)#import是oc中导入头文件的关键字,而且只需导入一次就行.(2)#include是cc++导入头文件的关键字,include导入头文件容易引起交叉编译.5.创建对象的语法:
(1)类名 *对象名 = [[类名 alloc]init];
(2)类名 *对象名 = [类名 new];
6.oc中的方法:(减号为实例方法,加号为类方法)
-|+(返回类型)方法名 : 参数列表
{
//方法体
}
(1)器就是方法的意思;(2)void意思是无返回值;Student为类名,意思为有Student类型的返回值
(3)with后面的name是属性的名称,newName是属性name的参数名称
初始化器:-|+(Student *)initWithName:(NSString *)newName{
self = [super init];//继承父类NSObject的init(初始化)方法 self->name=newName;return self;
} 便利构造器:-|+(Student *)studentWithName:(NSString *)newName{
Student *student = [[Student alloc]init];//实例化变量student student.name = newName;return student;
}
7.属性
#interface
@property(nonatomic,retain)NSString *name;(声明)等价于:(setter方法:设置器)
-(void)setAge:(int)newAge{ age = newAge;
}
#implemention
@synthesize name;(合成)等价于:(getter方法:访问器)
-(int)getAge{
return age;
}
8.点语法
(1)stu.name=@“liming”;等价于:
[stu setName:@“liming”];
(2)NSlog(@“%@”,[stu.name]);等价于:
NSlog(@“%@”,[stu getName]);
9.property有关语法
(1)readwrite 是可读可写特征;需要生成getter方法和setter方法.(2)readonly 是只读特性只会生成getter方法不会生成setter方法.(3)aign 赋值特性,setter方法将传入参数赋值给实例变量.(4)retain 表示持有特性,setter方法将传入参数先保留,再赋值,并且变量retaincount+1;
(5)copy
通过copy将对象复制一份,之前的对象会释放.(6)nonatomic 表示单线程安全.(7)atomic 表示多线程安全.10.变量作用域
(1)@protected 表示只有该类和其子类可以访问该类的变量.(2)@public 表示无论是自身还是子类的对象,还是其它类型的对象均能访问该类的变量.(3)@private 表示只有该类本身的对象可以访问该类的变量.11.面向对象三大特征:
(1)封装:隐藏内部实现,稳定外部接口.(2)继承:子类继承父类的所有非私有的方法和属性.(3)多态:不同类型的对象,对同一方法名的不同响应.注意: 要点一:oc中不允许多继承(一个类有多个父类),但允许多重继承(一个类的父类也拥有其自身的父类).要点二:一个类调用方法时,先从本类方法找,找不到再从父类找,一直往上直到找到NSObject类中.12.self:是指向当前对象的指针.super:调用父类的方法.id:是一个指向任何一个继承了NSObject类的对象.13.开闭原则和里氏替换原则
(1)开闭原则(OCP Open Closed Principle): 核心是:对扩展开放,对修改关闭.改变一个软件时,应该通过扩展的方式来改变软件,而不应该修改原有的代码来实现变化.(2)里氏替换原则(LSP Liskov Substitution Principle):
(is A)原则:任何基类可以出现的地方,子类一定可以出现.a.继承必须确保超类所拥有的性质子类中仍然成立.b.子类对象总是可以替换父类对象.14.内存管理
(1)黄金法则:凡是对象使用了alloc,new,copy和retain,那么必须有相对应的release和autorelease.引用计数机制:对象创建后,运行时系统通过对象维护的一个计数器来描述有多少个其他对象在使用自己,当计数器为0时,释放该对象占用的内存空间(该对象调用dealloc方法)。
(2)浅复制:指针拷贝,只复制指向对象的指针,拷贝后原来对象的引用计数会+1.深复制:对象拷贝,复制引用对象,重新开辟一块内存,原来对象的引用计数不变.(3)OC采用的是引用计数机制管理对象所占的内存.(4)ARC(automotic reference counting)自动引用计数: 它会自动加入内存的控制代码,控制对象的生命周期.隐式的管理内存,编译器会在适当的地方自动插入retain,release和autorelease消息.ARC新特征:增加了竖向定义关键字,用strong代替retain,用weak代替aign.(5)释放内存是dealloc.内存泄露的快捷键:command+shift+b.内存泄露检测仪:command+I.(6)//字符串内存管理
{
//常量字符串,引用计数为-1或无穷大的数
NSString *str111 =@“kevin”;//常量字符串的声明
[str111 retain];//引用计数对常量字符串没有影响
NSLog(@“%ld”,[str111 retainCount]);
[str111 release];
//用initWithString创建字符串,引用计数为-1或无穷大的数
NSString *str2 = [[NSString alloc]initWithString:@“alen”];
[str2 retain];NSLog(@“%ld”,[str2 retainCount]);
[str2 release];
[str2 release];
//用initWithString创建字符串,引用计数为1(符合引用计数机制)
NSString *str333 = [[NSString alloc]initWithFormat:@“steven”];
[str333 retain];NSLog(@“%ld”,[str3 retainCount]);
[str333 release];
[str333 release];
} 注意:OC中的引用计数永远不可能为0.(7)程序在内存中运行,分几个区?各自用途? 答:a.栈区由编译器自动分配释放存放函数的参数值,局部变量值等.b.堆区一般由程序员手动分配释放,如果不释放可由系统释放.c.数据区存储全局和静态变量.d.代码区存放函数体的二进制代码.(8)引用和指针的区别? 答:引用是给变量起一个别名,也就是一个变量有两个名字,他们是同一块空间.指针是分配一块内存用来保存变量的地址,间接引用变量.15.类目,延展,协议
(1)类目(category):为已有的类添加方法.(2)延展(extension):为类添加私有方法.(3)协议(protocol):就是类A不方便实现的方法,委托类B实现.协议有两个修饰词:@required(必须实现的方法),@optional(选择实现的方法)
16.KVC,KVO以及通知中心
答:(1)KVC(key-value Coding)键值编码,是一种间接访问对象属性的方法.包括:setVaule: forKey: 和 valueForKey: 两个方法.(2)KVO(key-value OBserving)键值监听,它提供了一种监测属性变化的方法.{
//注册监听者
-(void)addobserver{
[self addObserver:self forKeyPath:@“name” options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
}
//监听后返回消息
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ NSLog(@“%@ %@”,context,change);
}
//移除监听者
-(void)dealloc{
//[self removeObserver:self forKeyPath:@“name”];
[name release];
[super dealloc];
}
}
(3)通知(Notification)
{
//注册通知
-(void)registerNotification{
NSNotification *notification;notification = [[NSNotification alloc]initWithName:MEETINGNOTIFICATION object:nil userInfo:nil];
}
//添加监听者
-(void)addObserver:(Workers *)worker{
[[NSNotificationCenter defaultCenter] addObserver:worker selector:@selector(getNotification)name:MEETINGNOTIFICATION object:nil];
}
//创建并发送通知
-(void)postNotification{
[[NSNotificationCenter defaultCenter] postNotificationName:MEETINGNOTIFICATION object:nil];
}
//移除监听者
-(void)removrNotification:(Workers *)worker{
[[NSNotificationCenter defaultCenter] removeObserver:worker name:MEETINGNOTIFICATION object:nil];
}
}
17.delegate和Notification的区别? 答:(1)delegate针对one-to-one关系,并且reciever可以返回值给sender;
(2)notification 可以针对one-to-one/many/none,reciever无法返回值给sender; 所以,delegate用于sender希望接受到reciever的某个功能反馈值,notification用于通知多个object某个事件
18.可变和不可变的具体意思? 答:不可变得意思是,当一个对象初始化后,它的内存里面存的值不能改变了(调用的时候,一般是把值复制一份传个另一个变量).可变是,这个对象的内存值是可以改变的.19.单例
(1)单例模式:保证一个类仅有一个实例,并提供一个全局接口.(2)手写一个单例:
static MyCla *instance = nil;//创建全局静态实例
+(MyCla *)getInstance{ if(!instance){//如果instance为空才创建一个新的实例 instance = [[MyCla alloc]init];
} return instance;
}
20.集合类
1.遍历
//字典遍历
for(int i = 0;i
}
//数组遍历 方式一
for(int index = 0;index
} NSLog(@“”);方式二 快速枚举法
for(id object in arr1){ NSLog(@“%@”,object);
} 注意:a.{}表示字典
()表示数组
{()}表示集
b.键是唯一的,一个对象可以对应多个键.c.集合是无序的.//数组排序 方法一:
NSArray *arr = @[[NSNumber numberWithInt:23],[NSNumber numberWithInt:16],[NSNumber numberWithInt:28],[NSNumber numberWithInt:90],[NSNumber numberWithInt:4]];//新语法(定义)
NSArray *sortedArr = [arr sortedArrayUsingSelector:@selector(compare:)];NSLog(@“%@”,sortedArr);方法二:
Student *stu1 =[[Student alloc]init];stu1.score=85;
Student *stu2 = [[Student alloc]init];stu2.score=79;
Student *stu3 = [[Student alloc]init];stu3.score=98;
NSArray *stuArr =@[stu1,stu2,stu3];
NSArray *sortedStuArr = [stuArr sortedArrayUsingSelector:@selector(compareStudent:)];for(int i = 0;i
Student *stu = [sortedStuArr objectAtIndex:i];NSLog(@“%lf”,stu.score);
//倒序排列:
-(void)invert{ for(int i = 0;i
[self exchangeObjectAtIndex:i withObjectAtIndex:[self count]-i-1];
}
}