设为首页 加入收藏

TOP

iOS内存管理之MRC(三)
2023-07-23 13:26:37 】 浏览:345
Tags:iOS 管理之 MRC
} }

8、autorelease 错误用法

  • 不要连续调用 autorelease
@autoreleasepool {
 // 错误写法, 过度释放
    Person *p = [[[[Person alloc] init] autorelease] autorelease];
 }
  • 调用 autorelease 后又调用 release(错误)。
@autoreleasepool {
    Person *p = [[[Person alloc] init] autorelease];
    [p release]; // 错误写法, 过度释放
}

五、 MRC 中避免循环引用

定义两个类 Person 类和 Dog 类

  • Person 类:
#import <Foundation/Foundation.h>
@class Dog;
 
@interface Person : NSObject
@property(nonatomic, retain)Dog *dog;
@end
  • Dog 类:
#import <Foundation/Foundation.h>
@class Person;
 
@interface Dog : NSObject
@property(nonatomic, retain)Person *owner;
@end

执行以下代码:

int main(int argc, const char * argv[]) {
    Person *p = [Person new];
    Dog *d = [Dog new];
 
    p.dog = d; // retain
    d.owner = p; // retain  assign
 
    [p release];
    [d release];
 
    return 0;
}

就会出现 A 对象要拥有 B 对象,而 B 对应又要拥有 A 对象,此时会形成循环 retain,导致 A 对象和 B 对象永远无法释放。

那么如何解决这个问题呢?

不要让 A retain B,B retain A。
让其中一方不要做 retain 操作即可。
当两端互相引用时,应该一端用 retain,一端用 assign。

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Apple Xcode 14 (14A309) 正式版.. 下一篇内存管理(二)之别小看了Tagged-..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目