面向对象的三大特性:封装、继承、多态。
OC变量和基本数据类型
1.OC里面实例变量不能赋初值。局部变量最好初始化。
2.float 有效数字为6~7位。%f。double 有效数字为15~16位。%e %f %g。
3.逻辑型Boolean true或false,也可以是0或非0。
4.id类型是OC中独有的数据类型,它可以存储任何类型的对象,从某种意义上说,它就是一般的对象类型。将number声明为id类型的变量。如:idnumber;
格式说明符:%p。
基本数据类型转换
默认转换。原则:容量小的转换为容量大的数据类型。
数据类型按容量大小排序为:
Byte,short,char(不会互相转换,他们三者在计算时首先会转换成int类型)>int>long>float>double
强制转换。原则:容量大的转换为容量小的数据类型。加上强制转换符,但可能造成精度降低。
OC运算符和表达式
注意:++(--)在前时先运算再取值;在后时先取值再运算。
!:逻辑非 &:逻辑与 |:逻辑或 ^:逻辑异或 &&:短路与(c语言中&&是一种双目运算符,表示与运算,而当左边所给表达式或变量为0时,不再计算右侧,整个表达式为零。) ||:短路或
if条件和for循环语句
求闰年的编程方法:((year % 4 ==0 && year % 100 !=0)||(year% 400 == 0))
Printf和NSlog的区别:(源于网络)
1.最本质的区别在于NSLog输出的日志,在debug下面,NSLog的输出会被写到system.log,而printf是不具备日志属性的。
2.NSLog会自己加上换行符,不需要自己添加换行符,printf需要手动添加\n。
3.NSLog会自动加上时间和进程信息,而printf仅将输入的内容输出不会添加任何额外的东西。
4.输入类型有区别:NSLog期待NSString*,而printf期待constchar *。
5.NSLog支持%@去打印一个对象类型,但printf不支持。
Objective-C的 self和 super(源于网络)
self 是类的隐藏的参数,指向当前当前调用方法的类,另一个隐藏参数是 _cmd,代表当前类方法的selector。这里只关注这个self。super是个啥?super并不是隐藏的参数,它只是一个“编译器指示符”,它和 self指向的是相同的消息接收者,拿上面的代码为例,不论是用[self setName]还是[super setName],接收“setName”这个消息的接收者都是PersonMe* me 这个对象。不同的是,super告诉编译器,当调用setName的方法时,要去调用父类的方法,而不是本类里的。
当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用super时,则从父类的方法列表中开始找。然后调用父类的这个方法。
while、break和continue
switch语句
注意case穿透,建议使用break语句与之搭配使用。
程序的执行过程
面向对象的基本概念
万事万物皆对象
类可以看成是静态属性(实例变量;OC里面实例变量不能赋初值)和动态属性(方法)的结合体。
实例变量
实例变量可以使用OC语言中任何一种数据类型(包和指针类型)。
即:在声明实例变量的时候不能为其初始化,系统默认会初始化括基本类型。
实例变量的默认作用域范围是整个类。
多态(事物的多种形态)
类的声明和创建内存分析
IOS SDK里面提供了大量编程人员使用的类,编程人员也可以定义自己的类。
用@interface来声明一个类,冒号表示继承关系,冒号后面的是类的父亲。
NSObject是所有类的父类。
@end关键字结束
Eg:
@interface NewClassName:ParentClassName
{
实例变量;
…
}
方法的声明;
…
@end
@implementation NewClassName
方法的实现
{
//code
}
@end
OC的方法声明“-”表示实例方法,“+”表示类方法。
对象的初始化
对象必须先创建,然后初始化,才能使用。
NSObject *object = [[NSObject alloc] init ];
首先为对象分配内存地址,为初始化做准备。初始化是对象创建过程中将分配对象的状态设置为合理的初始值、使之处于可用状态的阶段。通过约定,我们要求初始化以init开头,并且在成功后完成初始化,返回一个动态类型对象(id),如果失败则返回nil。初始方法可以包含一个或多个参数用于指定初始值。
约定俗称的命名规则:
·类名首字母大写
·变量名和方法名首字母小写
·使用驼峰标示
方法的相同:两个方法是否相同,与参数类型和返回类型无关。
self和super关键字
self指的是类对象本身
super是父类对象本身
self用来调用本类对象的方法
super调用父类的方法
@class和#import
@class(解决相互包含的问题)
@property属性和点语法
设置器和访问器
@property和@synthesize
在@property()括号中,可以填写的属性:
readwrite: 默认。
readonly : 只读,意味着没有set方法。
assign: 默认,引用计数不增加。
retain: 引用计数增加1。
atomic: 默认,原子性。
nonatomic: 非原子性。
atomic是OC中的一种线程保护技术,是防止在未完成的时候,被另一个线程使用,造成数据错误。
Objective-C中@property的所有属性详解(源于网络)
1,assign:
简单赋值,不更改索引计数
假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此时a 和b指向同一块内存,请问当a不再需要这块内存,能否直接释放它?答案是否定的,因为a并不知道b是否还在使用这块内存,如果a释放了,那么b在使用这块内存的时候会引起程序crash掉
应用场合:
对基础数据类型 (例如NSInteger,CGFloat)和C数据类型(int, float, double, char, 等)
适用简单数据类型
2,retain:
与strong相对应,使用了引用计数,retain+1,release-1;当引用 计数为0时,dealloc会被调用,内存被释放
3,copy:
用于非共享内存时,每个指针有自己的内存空间
4,atomic//默认属性
A,当一个变量声明为atomic时,意味着在多线程中只能有一个线程能对它进行访问
B,当一个变量声明为atomic时,该变量为线程安全型,但是会影响访问速度,
C,当一个变量声明为atomic时,在非ARC编译环境下,需要设置访问锁来保证对该变量进行正确的get/set
5,nonatomic
A, 当一个变量声明为nonatomic时,意味着多个线程可以同时对其进行访问
B, 当一个变量声明为nonatomic时,它是非线程安全型,访问速度快;
C, 当一个变量声明为nonatomic时,当两个不同的线程对其访问时,容易失控。
总结:atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:
if (property != newValue) {
[property release];
property = [newValueretain];
}
6.strong://ARC中默认属性,等于非ARC中的retain
与retain相对应,
应用场景:
strong属性用于ARC中
@property (strong,nonatomic) ViewController*viewController;
7,weak:
与assign相对应,
应用场景:
用于IBOutlets,如,UIViewController的子类,即一般的控件。
@property (weak, nonatomic) IBOutlet UIButton*myButton;
strong与weak的区别举例:
前提:
我们把要用strong或者weak的对象比作一只风筝,风筝想挣脱线的束缚,自由飞翔去,如果此时有一根线,那么这只风筝就挣脱不了
过程分析
strong属性的变量:
当我们把指向一只风筝的变量声明为strong时,此时,你就拥有控制这只风筝的线,假如此时有五个人同时控制这只风筝(即这只风筝对象有三个strong类型的变量指向它),那么只有一种情况,这只风筝才会挣脱掉线的束缚:这三个人都放掉手中的线,(release掉)
weak属性的变量:
当我们把指向一只风筝的变量声明为weak时,此时,就像站在旁边看风筝的观众们一样,当上面的三个人还握着手中的线时,他们只能看到风筝,并不能控制它,他们能做的只能是用手指指向风筝,并大喊,“看,那只风筝飞得真高!”,然而,当上面的三个人把手中的线都放掉时,此时,风筝飞走了,看不见了,不管有再多的观众,他们再也看不到风筝了,这个故事告诉我们一个道理:当strong类型的指针被释放掉之后,所有的指向同一个对象的weak指针都会被清零。
8,readonly
只有get方法,没有set方法
9,readwrite//默认属性
有get/set方法
10,unsafe_unretauined
用在ARC编译环境下,在此环境下,与assign相似。它只是告诉ARC如何正确地调用声明为unsafe_unretauined变量的retain和release
点语法
static关键字:类体内的全局变量的声明。(只在类体里有效)
类的继承与重载(源于网络)
子类可以继承父类的实例变量和方法。
1、复合通过包含作为实例变量的的对象指针实现的。
@interface Unicycle : NSObject
{
Pedal*pedal;
Tire*tire;
}//Pedal和tire通过复合的方式组成了Unicycle
2、存取方法——用来读取或者改变某个对象属性的方法。
#import <Foundation/Foundation.h>
@interface Car: NSObject
{
Engine *engine;
Tire * tires[4];
}
-(Engine *) engine;//getter访问器
-(void) setEngine : (Engine *)newEngine;//setter访问器
-(Tire *) tireAtIndex : (int)index;
-(void) setTire : (Tire *)tire atIndex : (int)Index;
@end//Car
3、继承与复合
继承是“is A”关系;复合是“has A”关系。