Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone ARC问题-无法将方法传递给委托?_Iphone_Objective C_Ios_Automatic Ref Counting - Fatal编程技术网

Iphone ARC问题-无法将方法传递给委托?

Iphone ARC问题-无法将方法传递给委托?,iphone,objective-c,ios,automatic-ref-counting,Iphone,Objective C,Ios,Automatic Ref Counting,这是我的设想。我有一个类a。在它的实现中,我创建类型B的对象,并将B的委托设置为self(因此B.delegate=self在类a的实现中的某个地方) 类有一个实例方法-(void)printThis 现在在B的实现中,当我尝试执行[delegate printThis],它给了我以下错误: “此选择器的实例方法未知” 当然,这是我启用ARC的时候。上面的委托模式在没有ARC的IOS4.x中运行良好。当我关闭ARC时,它仍然会这样。ARC与向代表传递消息有什么关系 骨架代码: A.h 上午 B.

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

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

现在在B的实现中,当我尝试执行
[delegate printThis],它给了我以下错误:
“此选择器的实例方法未知”

当然,这是我启用ARC的时候。上面的委托模式在没有ARC的IOS4.x中运行良好。当我关闭ARC时,它仍然会这样。ARC与向代表传递消息有什么关系

骨架代码:

A.h

上午

B.h

文学硕士

重要编辑:


请注意,这里和那里的方法都会发生这种情况。例如,我有一些其他的方法,比如printThat等,它们工作时没有错误。我不知道发生了什么事

您需要在协议中定义
-打印此
,并制作一个实现此协议的脚本。您还需要将代理标记为符合此代理

i、 e:

@协议打印机
-(作废)打印本;
@结束
@接口A:NSObject
//...
@结束
@接口B://。。。
@属性(非原子,弱)id委托;
@结束

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

我的问题是,这与启用ARC有什么关系?它在iOS 4.x和iOS 5.0上都能正常工作,在ARC关闭的情况下也能正常工作。这是一个编译器错误:修复所有编译器错误和警告。好的,等等。我在接口a中有一个方法声明:-(void)printThis;发布您的界面(相关位)我已经更新了我的答案,将代理标记为
id
,而不仅仅是
id
。好奇的是,如果您通过
delegate
的getter而不是直接访问ivar,您是否仍然存在ARC on的问题?无论哪种方式,遵循协议都是更好的设计。
@class B;

@interface A: blah blah
{
    B objB;
}

-(void) printThis;
objB = [[B alloc] init];
objB.delegate = self;

- (void)printThis {
    //doSomething
}
@interface B: blah blah
{
    //id delegate; //used to be there, now I just property & synthesize
}

@property (nonatomic,weak) id delegate;
@synthesize delegate;

[delegate printThis]; //error with ARC ON, works with OFF
@protocol Printer <NSObject>

- (void)printThis;

@end

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

@interface B : //...

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

@end