self-> _ xxx和_xxx之间的区别是什么?

时间:2018-07-20 12:16:10

标签: objective-c objective-c-blocks

有一些代码:

@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,但是为什么呢?

1 个答案:

答案 0 :(得分:2)

如果_name1是类C的实例变量,则在类C的实例方法的主体中,简单变量引用:

_name1

只是的简写

self->_name1

这意味着:

  

访问变量_name1引用的对象中的实例变量self,并且self被自动设置为引用在其上调用了实例方法的对象(例如{{1 }}在执行[v method ...]时,其method变量将引用调用者self引用的对象。)

此缩写表示偶然的(并非所有保留周期都是不必要的或不好的),因为v的使用并不立即显而易见。

在代码示例中,您有对self的隐藏引用,对selfweakSelf的使用不会更改缩写的扩展名,所以:

strongSelf

仍扩展为:

_name1 = @"123";

浪费所有避免保留周期的精力。要解决此问题,您不得使用速记,而应写下您想要的内容:

self->_name1 = @"123";