A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 1374656143 中级黑马   /  2015-8-21 00:08  /  1992 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

求各路大神解答啦

2 个回复

倒序浏览
MRC下
@property (nonatomic, assign) id<PPWebViewDataDelegate> delegate;
相当于
- (void)setDelegate:(id<PPWebViewDataDelegate>)delegate
{
    if (_delegate != delegate) {
        _delegate = delegate;
    }
}


ARC下
@property (nonatomic, weak/assign) id<PPWebViewDataDelegate> delegate;
相当于
- (void)setDelegate:(id<PPWebViewDataDelegate>)delegate
{
    if (_delegate != delegate) {
        _delegate = delegate;
    }
}



MRC/ARC下
@property (nonatomic, strong/retain/copy) id<PPWebViewDataDelegate> delegate;
相当于

- (void)setDelegate:(id<PPWebViewDataDelegate>)delegate
{


    if (_delegate != delegate) {
        [_delegate release];
        _delegate = [delegate retain/copy];
    }
}
回复 使用道具 举报
1. Objective-c语言中的MRC(MannulReference Counting)
在MRC的内存管理模式下,与对变量的管理相关的方法有:retain,release和autorelease。retain和release方法操作的是引用记数,当引用记数为零时,便自动释放内存。并且可以用NSAutoreleasePool对象,对加入自动释放池(autorelease调用)的变量进行管理,当drain时回收内存。
(1)      retain,该方法的作用是将内存数据的所有权附给另一指针变量,引用数加1,即retainCount+= 1;
(2)      release,该方法是释放指针变量对内存数据的所有权,引用数减1,即retainCount-= 1;
(3)      autorelease,该方法是将该对象内存的管理放到autoreleasepool中。
示例代码:

//假设Number为预定义的类

Number* num = [[Number alloc] init];

Number* num2 = [num retain];//此时引用记数+1,现为2

[num2 release]; //num2 释放对内存数据的所有权 引用记数-1,现为1;

[num release];//num释放对内存数据的所有权 引用记数-1,现为0;

[num add:1 and 2];//bug,此时内存已释放。
//autoreleasepool 的使用 在MRC管理模式下,我们摒弃以前的用法,NSAutoreleasePool对象的使用,新手段为@autoreleasepool

@autoreleasepool {

       Number* num = [[Number alloc] init];

              [numautorelease];//由autoreleasepool来管理其内存的释放

   }

2. Objective-c语言中的ARC(AutomaticReference Counting)

在ARC中与内存管理有关的标识符,可以分为变量标识符和属性标识符,对于变量默认为__strong,而对于属性默认为unsafe_unretained。也存在autoreleasepool。
在ARC内存管理模式下,其属性的标识符存在以下几种:

@property (nonatomic/atomic, assign/retain/strong/weak/unsafe_unretained/copy,readonly/readwrite) Number* num;//默认为unsafe_unretained

其中assign/retain/copy与MRC下property的标识符意义相同,strong类似与retain,assign类似于unsafe_unretained,strong/weak/unsafe_unretained与ARC下变量标识符意义相同,只是一个用于属性的标识,一个用于变量的标识(带两个下划短线__)。所列出的其他的标识符与MRC下意义相同。

(1)对于assign,你可以对标量类型(如int)使用这个属性。你可以想象一个float,它不是一个对象,所以它不能retain、copy。

(2)对于copy,指定应该使用对象的副本(深度复制),前一个值发送一条release消息。基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。特别适用于NSString,如果你不想改变现有的,就用这个,因为NSMutableString,也是NSString。





@autoreleasepool {

       Number* num = [[Number alloc] init];

              [numautorelease];//由autoreleasepool来管理其内存的释放

   }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马