黑马程序员—IOS基础之OC—ARC和Category
来源:互联网 发布:java接口防止重复调用 编辑:程序博客网 时间:2024/05/19 20:01
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——
第一章 ARC
一、ARC概念及原理
在引入ARC内存管理之前我们先引入指针的概念
1、指针分类
(1)强指针,如果不做任何说明OC中得指针默认为强指针,关键字strong。(2)弱指针,__weak关键字修饰的指针为弱指针。
2、概念及原理
(1)概念:ARC是自动内存管理方式,是Objictive编译器的一种特性,不是运行时特性或垃圾回收机制。(2)原理:只要对象没有强指针指向,对象就会释放内存空间。
二、ARC的使用
1、ARC的入门
(1)判断是否是ARC机制,对对象不做release出来,用dealloc方法查看项目信息,看是否释放。代码如下:
@implemention Person-(void)dealloc{NSLog(@"person dealloc");}@end#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) { @autoreleasepool { Person *p =[Person new]; [p run]; } //运行到这里会自动释放对象,会打印person dealloc return 0;}
注意:dealloc方法中不能调用父类的方法即:[super dealloc]。
(2)ARC的使用,正常创建对象,不用手动释放。
2、ARC下单对象内存管理
因为局部变量会在自动释放池的末尾销毁,那么此时对象一般就没了强指针指向,对象随之就会被销毁。
#import <Foundation/Foundation.h>@interface Person : NSObject-(void)run;@end@implementation Person-(void)run{ NSLog(@"person run"); }@endint main(int argc, const char * argv[]) { @autoreleasepool { Person *man =[Person new]; Person *women =man; //虽然man指向nil,但内存不会释放,因为还有强指针women指向。验证了判断准则 man=nil; } return 0;}
内存释放的过程:先释放,若有弱指针指向,就给弱指针赋值为nil。
3、ARC下多对象内存管理
在ARC机制下不能使用retain作为@property的参数,应该使用strong和weak作为@priperty的参数。
#import <Foundation/Foundation.h>@class Dog;@interface Person : NSObject@property (nonatomic,weak) Dog *dog;@end@implementation Person@end@interface Dog : NSObject@end@implementation Dog@endint main(int argc, const char * argv[]) { @autoreleasepool { Person *p = [Person new]; //指向d的是一个弱指针 p.dog = d; //d马上释放,无强指针指向 d=nil } return 0;}
4、ARC下循环应用问题
#import <Foundation/Foundation.h>@class Dog;@interface Person : NSObject@property (nonatomic,strong) Dog *dog;@end@implementation Person@end@interface Dog : NSObject@property (nonatomic,strong) Person *owener;@end@implementation Dog@endint main(int argc, const char * argv[]) { @autoreleasepool { Person *p = [Person new]; Dog *d = [Dog new]; d.owener=p; p.dog = d; } //程序运行到括号完时,不会退出,因为局部变量p,d虽然销毁,不再指向对象,但是Person和Dog互相指向,所以不会释放 //循环引用若有一个指针指向,对象都会释放,若两个都是强指针都无法释放。 //解决办法:一端使用weak,一段使用strong return 0;}
5、ARC下set方法内存管理@property参数
(1)原子性和读写的参数都和MRC下是一样的。(2)ARC下没有了retain方法,取而代之的是strong和weak。
6、ARC使用特点及注意事项
特点 (1)不允许release、retain和retain count的使用。(2)允许dealloc,不允许[super dealloc](3)@preperty参数的变化注意(1)ARC中弱指针指向的对象不存在了,弱指针为nil。(2)__weak Person *p=[Person new];是不允许这样写的,对象刚创建,由于指向的是弱指针,创建的瞬间就被释放了,不正确。
`
第二章 Category
一、分类的概念和使用流程
1、分类的概念
category称为分类、类别或者类目。category是OC特有的语法。作用:在不修改原有类的基础上增加新方法,使得一个庞大的类可以分模块开发,可以由多个人来编写,更利于团队合作目的:(1)对现有类进行扩展(2)作为子类的替代手段(3)不需要定义和使用一个类(4)对类中得方法归类
2、使用分类的实现步骤
分类的实现分为三步:分类的声明、分类的实现和分类的使用分类的声明:类名+(扩展方法)分类的实现:待扩展类+(分类的名称)分类的实现:和使用类中原有的对象一样
//声明@interface Person(base)-(void)run;@end//实现@implementation Person(base)-(void)run{NSLog(@"base run");}@end//使用Person *p = [Person new];[p run];
3、分类使用注意事项
(1)分类只能增加方法,不能增加成员变量(2)分类可以访问原来类的成员变量(3)分类和原类出现同名的方法,优先调用分类的方法,原来类的方法被忽略。(4)也不能用@property定义新方法,@preperty int age;错误的。(5)当出现多个分类方法同名时?执行的时最后编译的类别,编译的顺序可以改变。
4、分类非正式协议
NSObject或其子类Foundation框架中的类增加新的类别 称为非正式协议。NSString+countnum//非正式协议Gun+shot普通类别
//声明@interface NSString(countnum)-(void)countnum;@end//实现@implementation Person(base)-(void)countnum{int count = 0;for(int i=0;i<self.length;i++){unichar ch = [str characteAtIndex:i];if(ch>'0'&&ch<'9'){count++;}}}@end//使用NSString *str=@"sadn239d";[str countnum];
5、分类的延展
类的延展的概念:类的延展是分类的一个特例,它就是分类声明中,分类名为空的情况。特点(1)可以在延展中定义实例变量(2)不能够用@implementation 类名写(3)可以用@property定义私有的变量和方法
@interface Person(){//定义实例变量float _height;}-(void)run;//@property的使用@property int age;@end@interface Person:NSObject@end@implementation Person//不允许()//方法在这里实现-(void)run{NSLog(@"Person run");}@end
0 0
- 黑马程序员—IOS基础之OC—ARC和Category
- 黑马程序员------OC ARC管理和Category
- 黑马程序员—— OC加强---ARC+Category+Block
- 黑马程序员-IOS基础之OC分类(Category)
- 黑马程序员IOS基础---OC学习之ARC
- 黑马程序员-IOS-OC基础-ARC
- 黑马程序员——IOS基础——OC内存管理ARC
- 黑马程序员——OC基础——category、description和SEL
- 黑马程序员——OC基础:block和Protocol及Category
- 黑马程序员13——OC语言之Category
- 黑马程序员——OC之Category、Block
- 黑马程序员——OC—构造方法和Category
- 黑马程序员——OC的Category和Protocol
- 黑马程序员——OC基础:内存管理和自动引用计数(ARC)
- 黑马程序员——OC基础:内存管理和自动引用计数(ARC)
- 黑马程序员—IOS基础之OC—内存管理
- 黑马程序员——ios开发基础之OC简介
- 黑马程序员——OC之ARC、Block、Protocol
- 1106 排序
- Asp.mvc(一)~使用MongoDB来存储数据
- C++11中,获取随机数的新方法default_random_engine
- [Android]模拟器不能启动,报错:Cannot set up guest memory 'android_arm': Invalid argument
- 学习笔记---Android Handler机制
- 黑马程序员—IOS基础之OC—ARC和Category
- c语言实现二分搜索算法
- Maven安装,Eclipse创建项目过程
- Improving Your Code With Android Support Annotations(译文)
- 可数集合与不可数集合
- Rotate Image
- λ演算
- JAVA线程中ThreadLocal和volatile的说明
- HDU水题 统计元音