Block用copy来修饰

block也经常使用copy关键字,可见官方文档Objects Use Properties to Keep Track of Blocks

block使用copy是从MRC遗留下来的“传统”,在MRC中,方法内部的block是在栈区的,使用copy可以把它放到堆区.在ARC中写不写都行:对于block使用copy还是strong效果是一样的,但写上copy也无伤大雅,还能时刻提醒我们:编译器自动对block进行了copy操作。

block在创建的时候,它的内存是分配在栈上的,而不是在堆上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。因为栈区的特点就是创建的对象随时可能被销毁,一旦被销毁后续再次调用空对象就可能会造成程序崩溃,在对block进行copy后,block存放在堆区.
使用retain也可以,但是block的retain行为默认是用copy的行为实现的,
因为block变量默认是声明为栈变量的,为了能够在block的声明域外使用,所以要把block拷贝(copy)到堆,所以说为了block属性声明和实际的操作一致,最好声明为copy。

copy此特质所表达的所属关系与strong类似。然而设置方法并不保留新值,而是将其“拷贝” (copy)。 当属性类型为NSString时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个NSMutableString类的实例。这个类是NSString的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝一份“不可变” (immutable)的字符串,确保对象中的字符串值不会无意间变动。只要实现属性所用的对象是“可变的” (mutable),就应该在设置新属性值时拷贝一份。

另一方面,block也会经常导致循环引用,所以通常的做法就是,在外部创建一个weakSelf(用__weak修饰的self),来防止循环引用。这里最好在block内部再声明一个strongSelf(用__strong来修饰weakSelf).这是因为保证代码在执行block期间,self不会被释放,当block执行完后,会自动释放该strongSelf;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`direct` 修饰的变量可以使用 RAC,但需要注意一些细节。 由于 `direct` 是一个实例变量,而不是 `@property`,因此不能使用 `RAC` 提供的默认的 `@synthesize` 指令来自动生成访问器方法。如果想在 `RAC` 中使用 `direct` 变量,需要手动实现访问器方法。 下面是一个示例代码: ```objective-c @interface MyClass : NSObject @property (nonatomic, copy) NSString *indirectProperty; @end @implementation MyClass { NSString *_directProperty; } - (NSString *)directProperty { return _directProperty; } - (void)setDirectProperty:(NSString *)directProperty { _directProperty = [directProperty copy]; } @end ``` 这样,在使用 `RAC` 时,就可以通过访问器方法来访问 `direct` 变量了,例如: ```objective-c MyClass *obj = [[MyClass alloc] init]; [obj rac_observeKeyPath:@"directProperty" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) { NSLog(@"directProperty changed: %@", value); }]; obj.directProperty = @"new value"; ``` 需要注意的是,当使用 `RAC` 观察 `direct` 变量时,不能直接使用 `RACObserve` 宏,而需要使用 `rac_observeKeyPath:options:observer:block:` 方法来观察变量。这是因为 `RACObserve` 宏只能用来观察 `@property` 修饰的变量,不能用来观察实例变量。另外,需要手动实现访问器方法,才能让 `RAC` 正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值