iphone - 在 Objective C 中实现自定义类的委托(delegate)时的引用计数

标签 iphone objective-c

我有两个类,ClassA 将实例化 ClassB 并传递一个方法作为委托(delegate)。 ClassB 最终将调用 ClassA 的委托(delegate)。当ClassB存储它时,我需要在ClassA上添加保留吗?

我正在遵循“Cocoa 基础指南:与对象通信”中的“实现自定义类的委托(delegate)”,但演示的示例代码似乎没有考虑内存管理。

ClassA 将设置委托(delegate),并期望稍后当 ClassB 完成其工作时回调。

@implementation ClassA

-(void)launchSomething
{
   ClassB *classB = [[ClassB alloc] init];
   [classB setCallback:self withSelector:@selector(deferredWork)];

   // do some other stuff, assign class B to some View and eventually release class B
}

-(void)deferredWork
{
   NSLog(@"this is the method that will be deferred till some point in time");
}

ClassB 的头文件将存储并稍后调用委托(delegate):

@interface ClassB

id targetObject;
SEL targetMethod;

-(void) setCallback:(id)anObject withSelector:(SEL)aMethod

B类的实现:

@implementation ClassB
-(void) setCallback:(id)anObject withSelector:(SEL)aMethod
{
   // QUESTION: Do I need to add a 'retain' here on the targetObject?
   targetObject = anObject;
   targetMethod = aMethod;
}

-(void) someWorkLater
{
    if ( [targetObject respondsToSelector:@selector(targetMethod)] ) {
        // invoke the target object with the specific method
        [targetObject targetMethod];
    }
}

最佳答案

您不会在 ClassB 中保留 ClassA,因为 ClassA 已经拥有 ClassB,并且假设当 ClassA 被释放时,它将负责清理 ClassB 中的所有引用。

如果在 ClassB 中设置委托(delegate)方法时遵循“正常”所有权规则并保留 ClassA,那么最终会出现一个保留循环,其中两个对象都不会被释放。相反,您应该像现在一样使用弱引用。

关于iphone - 在 Objective C 中实现自定义类的委托(delegate)时的引用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/966277/

相关文章:

ios - 找到ViewController中初始化了哪个StoryBoard? Xcode

ios - 使用 watchOS 2 从 Apple Watch 向 iPhone 应用程序发送消息

iOS:Xcode 中的 ImageMagick 编译器警告

ios - 自定义字体不显示

iphone - iOS6 iPhone 5 屏幕底部没有可点击的内容

iphone - 如何在不退出应用程序的情况下显示 YouTube 视频?

iOS越狱: simple alert is not getting displayed in `applicationDidFinishLaunching`

objective-c - NSWindow 模态问题

iphone - 将整数转换为日期字符串

iphone - cocos2d 应用程序中无法解释的 16MB malloc?