gpt4 book ai didi

ios - 为什么访问 self 的属性不会在 self 拥有的 block 中引发编译器警告

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:10:31 24 4
gpt4 key购买 nike

我对内存管理/保留周期有点困惑。这是一个简单的类:

@interface Test : NSObject {
NSObject *objectA;
}
@property (nonatomic, strong) NSObject *objectB;

- (void)methodA;
@end

假设我有一个测试实例拥有的 block 。在这个 block 我做:

    objectA = nil;

我得到一个编译器,说它正在这个 block 中捕获 self ,这将导致保留循环。为什么?我在这里看不到自己。

那么如果我这样做:

self.objectB = nil;

没有警告!如果有的话,我应该在这里得到警告。

另外,如果我这样做:

[self methodA];

我在这里得到警告。所以我不确定幕后究竟发生了什么。我希望第一个不会给我警告,而最后两个会给我警告(因为我一直强烈指向自己),但实际上恰恰相反。

这是一个例子:

@interface ListVC () {
NSObject *objectA;
}
@property (nonatomic, strong) NSObject *objectB;
- (void)methodA;
@end

并在 viewDidLoad 中:

- (void)viewDidLoad {
[super viewDidLoad];

[self.tableView addPullToRefreshWithActionHandler:^{
self.objectB = nil; //no warning here
objectA = nil; //warning here
[self methodA]; //warning here (if i place this above previous warning
}];
}

最佳答案

在我看来,编译器只是懒得为同一个 block 多次警告您。我不确定这算不算是一项功能,但我看不出还有什么可能发生。

假设我们使用相同的编译器版本(我的是 Apple LLVM 4.2),试试这个:

@interface Jubilee : NSObject

@property (copy, nonatomic) NSData * d;

@end

@implementation Jubilee
{
NSString * s;
dispatch_block_t block;
}

@synthesize d;

- (void)erase
{
block = ^{
s = @"Agamemnon";
};

block = ^{
self.d = [NSData data];
};

block = ^{
[self prevaricate];
};

}

- (void)assemble
{
block = ^{
s = @"Agamemnon";
self.d = [NSData data];
[self prevaricate];
};
}

- (void)prevaricate
{
}

@end

我在 erase 中的每个 Block 处收到警告,但仅针对 assemble 中 Block 的第一行。这些行中的任何一条警告都是正确的。当你对一个 ivar 进行裸引用时,它隐含地是 self->ivar;,并且 Block 将保留 self 而不是 ivar 中的对象。

关于ios - 为什么访问 self 的属性不会在 self 拥有的 block 中引发编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14827842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com