2012-06-26 165 views
2

我有一个类,这个类有一个委托协议。我使用这个类在主类中创建一个对象,并将主类指定为委托。主类有一个我想在创建的类中读取的属性。然后,我这样做:为什么我必须施放代表?

BOOL prop = [self.delegate myProperty]; 

Xcode中抱怨说,当你发送消息给

如果我将消息发送到self.delegatedelegate可能不myProperty回应”阅读myProperty,和一般的Xcode从不抱怨一个没有铸造的对象,为什么我必须这样做

BOOL prop = [(myMainClass *)self.delegate myProperty]; 

使它工作?

更清楚,这里是一个发送给对象的消息的示例,而无需投:

[self.myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop){ 

    int Number = [[obj dictionaryOfNames] count]; 

}]; 

self.myArray是从另一个类是词典和具有这种性质dictionaryOfNames对象的数组。 Xcode从来没有要求我演员:

int Number = [[(myOtherClass *)obj dictionaryOfNames] count]; 

因为我不得不在上面为myProperty

回答

5

不同的类可以符合协议。如果您声明是符合协议你刚才说,你将实现该电源线的方法,但你可以在UIViewUIViewControllerMyOwnClassMyOtherClass

这就是为什么一个属性,通常像这样

宣布实现它
@property (nonatomic, weak) id <MyProtocol> delegate; 

所以你只是说你的委托是符合协议的对象。

+0

好的,但是如果我可以使用格式[obj消息]将消息发送到对象,为什么有必要识别该对象?尽管委托类,它应该接受格式[obj消息]没有欺骗,据我所知是Objective-C背后的想法或不? – SpaceDog

+0

您只能将消息发送给了解这些消息的对象,否则您会收到错误消息。尝试发送一些自定义消息给NSObject - 它不起作用。 – Pfitz

+0

抱歉,但这不是我所看到的。我已经添加了一些代码来解释我的问题。 – SpaceDog

0

您还没有表现出足够的代码让一个完全确定的答案,但总的来说我希望你委托的定义是只是ID,你可能已经使用NSObject的*或类似的东西。

编译器正在对源代码进行“静态”分析,并试图确定“self.delegate”指定的对象是否可能实现该方法。如果数据类型是NSObject *,那么编译器会查看特定的类定义以查看您的方法是否存在;如果不是,那么你会得到警告

如果消息接收者的数据类型是id,编译器往往放弃并说“好吧,它可能是任何东西,所以我会认为这将工作”。

表达式[obj dictionaryOfNames]的结果可能是NSDictionary类型,编译器可以看到该特定类的确对响应了count方法。

请注意,如果您为某个属性指定了类名称,但是编译器无法从该文件中看到整个类定义,则也可以得到此问题。例如,如果您有

myobject。H:

@class Something; 
@interface MyObject 
@property (retain) Something *delegate; 
@end 

myobject.m:

#import "myobject.h" 

[self.delegate doItYouFool]; 

然后编译器可以看到的是,表达“self.delegate”的结果是类型的东西*,但它不能看到的实际定义该类,因此无法查看其支持的消息。这通常会导致关于“前向定义”的警告。为了解决这个问题,你应该在.m文件中导入“something.h”,以便编译器对它正在使用的类有完整的了解。只是沉默的警告,在投射到ID

[(id)self.delegate doItYouFool]; 

你可以,当然,也再次得到警告说,“doItYouFool”不是已知的方法,因为你还没有包括头文件,它定义该消息。

+0

谢谢!!!!!!!!!!! – SpaceDog

相关问题