有一些代码:
@interface Person() {
NSString *_name1;
}
@property NSString *name2;
@property void (^blk)(void);
@end
那么self->_name1
和_name1
之间的区别是什么? self->_name2
和_name2
之间的区别是什么?
__weak __typeof__(self) weakSelf = self;
self.blk = ^(){
__strong __typeof(self) strongSelf = weakSelf;
_name1 = @"123";
}
会有保留周期。解决方案是将_name1
更改为strongSelf->_name1
,但是为什么呢?
答案 0 :(得分:2)
如果_name1
是类C
的实例变量,则在类C
的实例方法的主体中,简单变量引用:
_name1
只是的简写:
self->_name1
这意味着:
访问变量
_name1
引用的对象中的实例变量self
,并且self
被自动设置为引用在其上调用了实例方法的对象(例如{{1 }}在执行[v method ...]
时,其method
变量将引用调用者self
引用的对象。)
此缩写表示偶然的(并非所有保留周期都是不必要的或不好的),因为v
的使用并不立即显而易见。
在代码示例中,您有对self
的隐藏引用,对self
和weakSelf
的使用不会更改缩写的扩展名,所以:
strongSelf
仍扩展为:
_name1 = @"123";
浪费所有避免保留周期的精力。要解决此问题,您不得使用速记,而应写下您想要的内容:
self->_name1 = @"123";