Objective c 什么';自我与自我之间的区别是什么_xxx和xxx?
有一些代码:Objective c 什么';自我与自我之间的区别是什么_xxx和xxx?,objective-c,objective-c-blocks,Objective C,Objective C Blocks,有一些代码: @interface Person() { NSString *_name1; } @property NSString *name2; @property void (^blk)(void); @end 那么,self->\u name1和\u name1之间有什么区别呢?以及self->\u name2和\u name2之间的区别 __weak __typeof__(self) weakSelf = self; self.blk = ^(){
@interface Person() {
NSString *_name1;
}
@property NSString *name2;
@property void (^blk)(void);
@end
那么,self->\u name1
和\u name1
之间有什么区别呢?以及self->\u name2
和\u name2
之间的区别
__weak __typeof__(self) weakSelf = self;
self.blk = ^(){
__strong __typeof(self) strongSelf = weakSelf;
_name1 = @"123";
}
将有一个保留周期。解决方案是将
\u name1
更改为strongSelf->\u name1
,但是为什么呢?如果\u name1
是类C
的实例变量,那么在类C
的实例方法的主体中,简单变量引用:
_name1
仅是以下内容的简写:
这意味着:
在变量self
引用的对象中访问实例变量\u name1
,并且self
自动设置为引用调用实例方法的对象(例如在[v method…]
当执行方法
时,其self
变量引用调用方引用的同一对象
这种简写意味着意外的(并非所有的保留周期都是不需要的或不好的)保留周期会发生,因为self
的使用不是很明显
在代码示例中,您有这样一个对self
的隐藏引用,您对weakSelf
和strongSelf
的使用不会改变速记的扩展,因此:
_name1 = @"123";
仍然扩展到:
self->_name1 = @"123";
你为避免“保留”循环所做的所有努力都白费了。为了解决这个问题,你不能使用速记,而是写下你想要的:
strongSelf->_name1 = @"123";
如果
\u name1
是类C
的实例变量,则在类C
的实例方法的主体中,简单变量引用:
_name1
仅是以下内容的简写:
这意味着:
在变量self
引用的对象中访问实例变量\u name1
,并且self
自动设置为引用调用实例方法的对象(例如在[v method…]
当执行方法
时,其self
变量引用调用方引用的同一对象
这种简写意味着意外的(并非所有的保留周期都是不需要的或不好的)保留周期会发生,因为self
的使用不是很明显
在代码示例中,您有这样一个对self
的隐藏引用,您对weakSelf
和strongSelf
的使用不会改变速记的扩展,因此:
_name1 = @"123";
仍然扩展到:
self->_name1 = @"123";
你为避免“保留”循环所做的所有努力都白费了。为了解决这个问题,你不能使用速记,而是写下你想要的:
strongSelf->_name1 = @"123";
我不认为将
\u name1
更改为self->\u name1
会使工作有所不同。我知道,他们是一样的,是我的错。我应该使用weakSelf。我不认为将\u name1
更改为self->\u name1
会使它工作起来有所不同。我知道,他们是一样的,是我的错。我应该用懦夫。