设为首页 加入收藏

TOP

Objective-C中的内存管理(二)
2015-07-16 12:04:05 来源: 作者: 【 】 浏览:103
Tags:Objective-C 内存 管理
变成新的对象(新的内存地址), 新对象的引用计数为1, 原对象的引用计数不变. 遵循NSCopying协议.
mutableCopy: 也是复制一个对象. 新对象的引用计数为1.
即copy得到的均为一个独立的对象.

retain

retain其实是指针拷贝(地址相同), 会增加对象的引用计数,而基本数据类型或CoreFoundation对象没有引用计数。
把对象添加到数组中,引用计数将增加对象的引用次数+1.
即: 调用setter方法时, 先release旧值, 对赋予的新值进行引用计数+1. 二者的内存地址一样.

strong

strong是强引用, 对象的引用计数+1, 如string1和string2都指向一个字符串, 则string1=nil, 而string2不变.
strong变量执行ARC计数, 不会自动释放. 其死亡直接决定了所指向对象的死亡.
为了确保使用中的实例不会被销毁,ARC 会跟踪和计算每一个实例正在被多少属性,常量和变量所引用。哪怕实例的引用数为1,ARC都不会销毁这个实例。
为了使之成为可能,无论你将实例赋值给属性,常量或者是变量,属性,常量或者变量,都会对此实例创建强引用。之所以称之为强引用,是因为它会将实例牢牢的保持住,只要强引用还在,实例是不允许被销毁的。

weak

为了防止循环强引用,可采用弱引用和无主引用。这两种允许循环引用中的一个实例引用另外一个实例而不保持强引用,这样实例能够相互引用而不产生循环强引用。
弱引用 :对于生命周期中会变为nil的实例采用。
无主引用:对于初始化赋值后再也不会变为nil的实例采用。
weak是弱引用, 对象的计数不变. 如string1和string2都指向一个字符串, 则string1=nil, 那么string2也会变为nil.
因其没有retain内存地址, 若其指向的地址对象一旦释放, 则该指针会指向nil.
ARC空闲时释放, 对象释放时自动将指针置NULL. 不决定对象的存亡, 即使一个对象被持有无数个弱引用, 只要没有强引用指向它, 则最后还是会清除
如两个对象互相为对方的成员变量, 则一定不能同时retain, 否则dealloc函数形成死锁, 两个对象都无法释放. weak可以用于防止野指针和死锁, 避免循环引用.

__weak

__weak 声明了可以自动nil化的弱引用.
注意: 代码中使用self之类的有可能导致retain cycle, 所以一般用__weak的方式. 请看下边的城市列表例子.
在CityListVC中, 通过block将city的值传递给MainVC.
在CityListVC.h中: 定义block块对象

typedef void(^SelectedCity)(NSString *);
@property(copy,nonatomic) SelectedCity selectCity;
CityListVC.m中:
if (_selectCity) {
  _selectCity(cell.textLabel.text); // 这里要通过block进行View之间的数据传递.
}

MainVC.h中:

typedef void(^SelectedCity)(NSString *);
@property(copy,nonatomic) SelectedCity selectCity;

MainVC.m中:

    self.vTracks.selectedCity = @"城市";
    __weak MainViewController *weakVC = self;
    _selectCity = ^(NSString *city){
        weakVC.cityLabel.text = ([city isEqualToString:@"全国"]) ? @"城市" : city;
        weakVC.vTracks.selectedCity = ([city isEqualToString:@"城市"] | [city isEqualToString:@"全国"]) ? nil : city;
        [weakVC.vTracks invokeRefresh];
    };

在block中, 使用__weak的方式声明了一个weakVC, 弱引用的方式可以避免出现循环引用.

static

static可以视作类变量, 跟对象实例无关. 已经实例化的各个对象之间的该static变量不会相互影响, 但对其的改变会影响到class本身. 若再次实例化新的对象, 则该新对象就拥有最新的static类变量.

const

const, 常量不能修改. 超出作用域后会释放. 即const对于对象生存期内是常量, 对于整个类而言可变.

extern

extern: 全局变量.

读写权限

readwrite, readonly: 控制成员变量的访问权限.

原子操作

nonatomic: 非原子性访问, 不加同步, 多线程并发访问.
atomic 线程保护. 互斥锁.

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Objective-c 创建类的使用 下一篇OC基础:继承.初始化方法,便利构造..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: