gpt4 book ai didi

Objective-C 访问 block 内的属性

转载 作者:可可西里 更新时间:2023-11-01 03:08:20 25 4
gpt4 key购买 nike

我已经阅读了 Apple 的 Blocks Programming Topics 和尽职调查在线搜索,但我仍然不清楚我是否正确地实现了我的 block 。我有一个客户端数组作为属性,在发送 NSNotification 时填充。客户端用作 TableView 数据源。下面的代码有效,但我很好奇它是否将 self 置于保留周期中。我应该做类似 __block id theClients = self.clients; 的事情,然后在 block 内引用 theClients 吗?

@property (strong, nonatomic) NSMutableArray *clients;

NSNotificationCenter *notifyCenter = [NSNotificationCenter defaultCenter];
__block id observer = [notifyCenter addObserverForName:queryHash
object:nil
queue:[[NSOperationQueue alloc] init]
usingBlock:^(NSNotification* notification){
// Explore notification

if ([[notification.userInfo objectForKey:kdatasetReturnKey] objectAtIndex:0]) {
NSArray *rows = [[notification.userInfo objectForKey:kdatasetReturnKey] objectAtIndex:0];
if (self.clients)
{
self.clients = nil;
}
self.clients = [[NSMutableArray alloc] initWithCapacity:rows.count];
for (NSDictionary *row in rows) {
[self.clients addObject:row];
}
} else {
NSLog(@"CLIENTS ERROR Returned: %@",[notification.userInfo objectForKey:kerrorReturnKey]);
}

[[NSNotificationCenter defaultCenter] removeObserver:observer];
}];

最佳答案

访问 clients 属性没有问题,因为它是一个强(即保留)属性。所以这里不需要 __block

一个问题可能是发送通知时 self 可能不再存在。然后您将访问已释放的对象,应用程序可能会崩溃!为避免这种情况,您应该在 dealloc 方法中删除观察者。

id observer 之前的__block 绝对是必须的!

编辑:

在 iOS 5 中,您可以使用弱引用安全地捕获 self:

__weak id weakSelf = self;

然后在 block 内您可以安全地使用 weakSelf.clients。当对象被释放时,变量 weakSelf 将自动变为 nil。

关于Objective-C 访问 block 内的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12056258/

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