黑马程序员--ios基础--oc-内存管理之ARC、Block

一.基本简介
  • ARC是iOS 5之后增加的新特性,完全消除了手动管理内存的烦恼,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再续奥担心内存管理,因为编译器为你处理了一切
  • ARC是编译器特性,而不是ios 运行时特性,它也不是类似于其它语言中的垃圾收集器。因此ARC和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化
二.基本原理
1.规则
  • ARC的规则非常简单:只要还有一个强指针变量指向对象,对象就会保存在内存中
2.强指针和弱指针
  • 默认所有实例变量和局部变量都是strong指针
  • 弱指针指向的对象被回收后,弱指针会自动变为nil 指针,不会引发野指针错误
三.使用注意
  • 不能调用release、retain、autorelease、retainCount
  • 可以重写dealloc,但是不能调用[super  dealloc]
  • @property:想长期拥有某个对象,应该用strong,其他对象用weak
  • 其它基本数据类型依然用assign
  • 两端互相引用时,一端用strong、一端用weak


学习笔记代码如下
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"

int main(int argc, const char * argv[]) {

   Person *p = [[Person alloc] init];
    
    Dog *d = [[Dog alloc] init];
    
    p.dog = d;
    
    d.person = p;
    return 0;
}

#import <Foundation/Foundation.h>
@class Dog;

@interface Person : NSObject

@property (nonatomic,strong) Dog *dog;

@end

#import "Person.h"

@implementation Person
- (void)dealloc
{
    NSLog(@"Person is dealloc");
}

@end

#import <Foundation/Foundation.h>
@class Person;

@interface Dog : NSObject
@property (nonatomic,weak) Person *person;

@end

#import "Dog.h"

@implementation Dog
- (void)dealloc
{
    NSLog(@"Dog is dealloc");
}

@end
Block
  • Block封装了一段代码,可以在任何时候执行
  • Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
  • 苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多
Blocks的定义

int (^MySum)(int, int) = ^(int a, int b) {
return a+b;
};

定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现
Block可以访问局部变量,但是不能修改。
int sum = 10;
int (^MyBlock)(int) = ^(int num) {
sum++;//编译报错
return num * sum;
};

如果要修改就要加关键字:__block
__block int sum = 10;

Blocks和函数指针对比
  • 定义函数指针 int(*myFn)();
  • 定义Blocks int (^MyBlocks)(int int)
  • 调用函数指针 (*myFn)(10,20)
  • 调用Blocks MyBlocks(10,20);
Blocks的赋值

  • 在声明的同时定义变量,然后赋值
int (^MySum)(int,int) = ^(int a,int b) {
return a + b;
};
  • 也可先用typedef先声明类型,再定义变量进行赋值
typedef int (^MySum)(int,int);
MySum sum = ^(int a,int b) {
return a + b;
}; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值