内存管理 arc 相关文档翻译 ios开发

本文详细介绍了ARC(自动引用计数)的使用规则,包括不能显示调用dealloc方法、禁止使用NSAutoreleasePool等。同时讲解了ARC引入的生命周期限定符如strong和weak,以及变量限定符的使用规范。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ARC 强制使用规则  ARC Enforces New Rules

1、不能显示的调用 dealloc 方法,不能重写 或者调用 relation ,release ,retain count,autorelease. 包括@selector(retain),@selector(release),等。你如果需要管理管理资源( 比如调用 setDelegate:nil )可以重写dealloc方法,但不要在 dealloc 里面 进行释放变量操作 也不要在dealloc方法里调用[super dealloc]因为 这条链是由编译器自动调用的

  你仍然可以对Core Foundation 类型的 对象使用CFRetain,CFRelease和其他相关的函数(参考“Managing Toll-Free Bridging”). 参考: http://blog.youkuaiyun.com/xiaofei125145/article/details/38315409

2不能使用NSAllocateObject orNSDeallocateObject

创建对象时使用 alloc ;  (You create objects usingalloc; the runtime takes care of deallocating objects.)

3、不能在C语言结构体内部使用  对象指针。你可以创建一个 Objective c 类来代替这个结构体。

4、不要随便的  把 id 转换为 void * ,或者 反向的转换。必须使用特定的转换方法 来告诉编译器对象的生命周期,你可以通过把  objective c 对象 转换为 Core Foundation 数据类型来实现。see“Managing Toll-Free Bridging.”   参考:http://blog.youkuaiyun.com/xiaofei125145/article/details/38315409

5、不能使用 NSAutoreleasePool 对象,arc 用 @autoreleasepool blocks 来代替。

6、不能使用 memory zones .

arc 中 再也用不着 NDZone, 它将要,永远的被modern Objective-C runtime 忽略。

7、变量命名限制,不要以 new 开头。

也就是说,不要声明 以 new 开头的 属性 ,除非 你给它制定了 其他的 getter 方法 如下:

// Won't work:  错误


@property NSString *newTitle;


 


// Works:  正确


@property (getter=theNewTitle) NSString *newTitle;





ARC Introduces New Lifetime Qualifiers

arc 引进了新的生命周期限定符   

弱引用的概念: 弱引用不会延长所指向对象的生命周期,并且 当所指向的对象将要回收的时候,会自动指向 nil;


属性限定符: strong 是默认的 描述符

retain  应由 strong 代替

assai 应由 weak 代替

// The following declaration is a synonym for: @property(retain) MyClass *myObject;


@property(strong) MyClass *myObject;


 


// The following declaration is similar to "@property(assign) MyClass *myObject;"


// except that if the MyClass instance is deallocated,


// the property value is set to nil instead of remaining as a dangling pointer.


@property(weak) MyClass *myObject;



变量限定符号:

_strong   默认的 ,只要有一个 strong 指针指向 ,对象就不会被释放  ,所以你声明函变量,如果是强应用的话,就可以什么限定符都不写。





__weak    不会影响对象的生命周期, 当对象 生命结束前 ,weak 指针会指向 nil 


局部错误的写法:  string 是 weak 类型 ,指向的 对象 没有 任何 强引用,所以 会 立刻释放 ,释放后 weak 会自动指向 nil ,所以打印结果是  string: null 

NSString * __weak string = [[NSString alloc] initWithFormat:@"First Name: %@", [self firstName]];

NSLog(@"string: %@", string);




__unsafe_unretained  与weak唯一的 区别就是不会指向  nil,比较危险 (当指向的对象被 回收后再 调用的话,就会出现异常 )




__autoreleasing   在 函数传参时使用 ,比如生命函数时 需要这样写 ,这样写函数返回时,error 会被自动释放。


-(BOOL)performOperationWithError:(NSError * __autoreleasing *)error;





(小插曲)编译器对代码的处理:(当传递参数时,如果穿进去的参数类型不符合 要求,编译器就会创建一个 临时变量 如下)

-(BOOL)performOperationWithError:(NSError * __autoreleasing *)error;方法AAAA声明。


编译器在编译时 会自动将下面代码处理为

NSError *error;


BOOL OK = [myObject performOperationWithError:&error];  // 调用方法 AAAA


if (!OK) {


    // Report the error.


    // ...


NSError * __strong error;


NSError * __autoreleasing tmp = error;


BOOL OK = [myObject performOperationWithError:&tmp];


error = tmp;


if (!OK) {


    // Report the error.


    // ...




arc 模式 下 ,在 方法内声明的 变量 如果类型为strong, weak, and autoreleasing ,编译器会 自动将 这些变量初始化为  nil ,

默认的为 strong; 所以下面打印结果为   name: null 

- (void)myMethod {


    NSString *name;


    NSLog(@"name: %@", name);

// name: null

}



关于 arc 的设置 

-fobjc-arc   没有使用arc 的工程中 设置文件 用arc 编译compiler flag

-fno-objc-arc 使用了arc的工程中设置部分 file 不使用arc compiler flag


arc支持:

支持 ARC的Xcode版本为 Xcode4.2 及其以后版本 (xcode4.1以前的都不支持 arc )

支持ARC 的 iOS系统为 IOS4及其以后版本 (个人认为,使用arc的项目,也可以打出兼容 ios4.x的包)

支持ARC的 OSX 系统为 x10.6及其以后的版本(以后版本为 64位系统)



弱引用不支持  ios4  和 x10.6 系统。

(个人理解 __weak 这个限定符如果使用了的话,xcode 就不能打兼容ios4.x的包)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值