gpt4 book ai didi

iphone - 如何避免 Objective C 中的循环调用?

转载 作者:行者123 更新时间:2023-11-28 22:41:37 25 4
gpt4 key购买 nike

我想标题本身就足以回答我的问题了。但是,我将在这里进一步解释,假设我有两个 View Controller A 和 B。A 是基础并且它正在插入 B,在一种情况下,我希望在 View (B) 中单击一个按钮时从 B 通知 A。如果我有那个实例,Objective C 允许直接调用 A View 。我认为这样做不是一个好习惯。这种情况应该如何处理..

感谢您的建议。

最佳答案

如果“A intimated from B”意味着您想要调用最初负责推送 B 的 A,您只需使用“后退”按钮或在代码中返回到 A:

[self.navigationController popViewController animated:YES];

B 不需要指向 A 的指针,导航 Controller 有那个,而 B 有一个指向导航 Controller 的指针,因为导航 Controller 在创建 B 时设置了 B 的 navigationController 属性。

如果您需要根据 B 中的某些操作在 A 中设置属性,您应该使用委托(delegate)来执行此操作。

在 B 中,您创建了一个名为 delegate 的属性。

在 A 中,当您创建 B 时,将其委托(delegate)给 A:

ViewControllerB* vcB = [[ViewControllerB alloc] init];
vcB.delegate = self;
[self.navigationController pushViewController:vcB];

然后在 B 中你可以在 pop 之前通过 delegate 回调给 A:

[self.delegate sendMessageWithValue:someValue];
[self.navigationController popViewController animated:YES];

如果您想格外小心,可以将消息传递附上:

if ([self.delegate respondsToSelector:@selector(sendMessageWithValue:)]) { ... }

为了在 B 不知道 A 的任何信息的情况下工作,除了它是委托(delegate)之外,B 应该在 header 中声明一个委托(delegate)协议(protocol)(在 @interface 之上)

@protocol BDelegateProtocol
- (void) sendMessageWithValue:(int)someValue;
@end

当您在 B 的 @interface 中声明 delegate 属性时,指定它期望遵循的协议(protocol):

@property (nonatomic, weak) id <BDelegateProtocol> delegate;

在 A 的@interface header 中,宣传您遵循该协议(protocol):

#import BViewController;

@interface AViewController:UIViewController <BDelegateProtocol>

这就是您所追求的松散耦合。 B 不必导入 A 的 header 。除了 A 符合 B 的协议(protocol)规范外,它不需要知道任何关于 A 的信息。

B 确实持有指向 A 的指针,但它是一个指针。这个非常重要。如果委托(delegate)属性是 strong,B 会将其委托(delegate)的保留计数增加 1。如果委托(delegate)持有指向 B 的强指针,那么它们都不能得到释放。当 A 存在时,B 的保留计数始终至少为 1,同样,当 B 存在时,A 的保留计数始终为 1:两者都不能被销毁。

在这种特殊情况下可能不会发生 - A 不需要像导航 Controller 那样保留 B - 但这种情况经常出现,因为委托(delegate)通常是创建和拥有委托(delegate)者的对象。请参阅 Apple 的 Practical Memory Management 中的“使用弱引用来避免保留循环”

关于iphone - 如何避免 Objective C 中的循环调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14375848/

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