iOS 基础概念入门

2021-05-19  本文已影响0人  NJKNJK

一、面向对象

面向过程编程以事件为中心,程序围绕事件,列出了事件的每个步骤,一步一步完成;
面向对象编程以事物为中心,程序围绕事物展开,完成事件只是一个任务;

二、面向对象三大特性

objective-c是一种能够完成复杂面向对象编程的简单的计算机语言,通过提供用于定义类和方法的语法,它扩展了标准的ANSI C程序设计语言。还提供类和接口(任何类都可采用)的动态扩展;

三、类对象的初始化

为了分配对象,需要发送alloc消息给该消息的类,来获取一个原始(未初始化)的实例,分配对象时,oc运行时会从应用程序的虚拟内存为对象分配足够的内存,除分配内存外,运行时在分配期间还会将所有实例变量设定为0。
分配原始实例后,必须要对它初始化,初始化的过程将一个对象的初始状态(即实例变量和属性)设定为合理的值并返回对象,初始化的目的在于返回可用的对象,原始初始化init会将内存中的所有对象清0;

1.自定义初始化方法:

创建对象分两步:分配空间和初始化,初始化的作用就是为对象赋初始值,初始化方法通常以init开头;

super:将消息发送给父类对象;
self:将消息发送给本对象(self始终代表接收消息的对象);
[super init]就是将init消息发送给父类对象;

2.指定初始化方法:

通常情况下是指能够赋值最多的方法;

四、类的属性及成员变量

属性是一组设置器与访问器,与类相似,属性需要声明和实现;
属性的声明写在类的.h文件中:

@property int age; 

上面的代码实际上相当于声明了两个方法

-(void)setAge:(int)age;
-(int)age;

属性的实现写在类的.m文件中:

@synthesize age = _age;

该语句的作用是使setAge、以及age方法都是在操作实例变量_age,如果类对象没有_age实例变量,编译器会自动声明一个实例变量_age,并且属性名是age

相当于实现了两个方法:

-(void)setAge:(int)age { _age = age; }
-(int)age{ return _age; }

属性也可以设置特性:

1.读写特性:
readwrite|readonly
getter = 方法名 // 指定访问器的方法名
setter = 方法名 // 指定设置器的方法名
2.原子性特性:
nonatomic // 非原子性,不保证多线程安全
atomic // 原子性,多线程访问时较安全
3.setter/getter语义特性:
assign // 直接赋值(适用于基本数据类型int,float,struct)
retain // 赋值时做内存优化 (适用于对象类型)
copy // 复制一个副本 (适用于特殊的对象类型)

属性和实例变量是不同的,前者是一组方法,后者是一个变量,定义属性使用@property@synthesize

对于属性的特性定义:基本数据类型使用assign,对象类型使用retain,实现了NSCopying协议的对象使用copy

五、内存管理

OC采用”引用计数机制”(retainCount)管理对象所占用的内存;
在OC语言中,NSObject类及子类的实例对象包含一个整形属性,用来统计当前的引用计数;
实例对象的生命周期:起始于alloc,终止于dealloc;
通过对类发送alloc消息,获得的实例对象的引用计数赋值为1,当实例对象的引用计数为0时,自动对该对象发送dealloc消息;

指针变量和对象区别联系:
对象是放在堆里面的,而指针变量是放在栈里面的,唯一的关系是指针变量存的是对象的地址;

非ARC下设置对象的实例属性

@property(retain, nonatomic) Student *stu;
1
-(void)setStu:(Student *)stu
{
    [stu retain]; // 拥有对象所有权
    [_stu release]; // release 之前的_stu,放弃所有权
    _stu = stu;
}

dealloc方法在对象引用计数为0的时候自动被调用,主要用于释放自身所占有的资源,永远不要手动调用dealloc;

-(void)dealloc
{
    [_stu release];
    [super dealloc];
}

六、自动释放池

1.使用NSAutoreleasePool类

当创建的对象未来某个时候销毁时,可以用对象的autorelease方法;对象会将所有权交给最近的NSAutoreleasePool对对象,当池对象drain或者release时,会逐一对池内的对象发送release消,尽量不要使用autorelease,而是使用release;

2.早期版本的自动释放池
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
// TODO
Student *stu = ...;
[stu autorelease];
[pool release];
3.现版本的创建
@autorelesepool{
    Student *stu = ...;
    [stu autorelease]; // 将所有权控制交给pool,stu不用手动release;
}
4.便利构造器
+(id) studentWithName:(NSString *)name
{
    Student *stu = ...;
    return [stu autorelese];
}
内存管理原则:

在dealloc中输出NSLog,看dealloc是否执行来判断对象是否释放;
关于内存管理,在最新版本的OC中,已经不需要我们手动去release了。

内存检测工具:
Analyze 内存静态分析(编译期)
leaks(Instruments) 内存泄露检测工具(运行期)

上一篇下一篇

猜你喜欢

热点阅读