ARC问题 - 无法通过委托方法?

时间:2011-10-13 22:16:34

标签: iphone objective-c ios automatic-ref-counting

这是我的情景。我有一个类A.在它的实现中,我创建了类型B的对象,并将B的委托设置为self(So B.delegate = self在A类的实现中的某个地方)。

A类有一个实例方法- (void)printThis;

现在在B的实现中,当我尝试[delegate printThis];时,它给了我这个错误: “没有已知的选择器printThis实例方法”

当然这是我启用ARC的时候。上面的委托模式曾经在没有ARC的iOS 4.x中正常工作。当我关掉ARC时它仍然会这样做。 ARC与将消息传递给代表有什么关系?

骨架代码:

A.H

@class B;

@interface A: blah blah
{
    B objB;
}

-(void) printThis;

A.M

objB = [[B alloc] init];
objB.delegate = self;

- (void)printThis {
    //doSomething
}

B.h

@interface B: blah blah
{
    //id delegate; //used to be there, now I just property & synthesize
}

@property (nonatomic,weak) id delegate;

B.m

@synthesize delegate;

[delegate printThis]; //error with ARC ON, works with OFF

重要编辑:

请注意,这种情况会发生在这里和那里。例如,我在A中有一些其他方法,如printThat等,它们可以正常工作。我对发生的事情毫无头绪!

1 个答案:

答案 0 :(得分:6)

您需要在协议中定义-printThis并使A实现此协议。您还需要将委托标记为符合此委托。

即:

@protocol Printer <NSObject>

- (void)printThis;

@end

@interface A : NSObject <Printer>
//...
@end

@interface B : //...

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

@end

ARC需要了解方法调用的接口才能正确管理内存。如果没有定义,那么它会抱怨。