Oli*_*ver 1 cocoa objective-c compiler-warnings
有没有办法让编译器在调用未定义的选择器时发出警告?例如,我在某个地方有这个电话:
methodcall time1:[[self.H1time copy] stringValue]
Run Code Online (Sandbox Code Playgroud)
在H1time类中不再存在stringValue方法,并且编译器没有引发任何内容.
copyWithZone声明为
- (NSHour*)copyWithZone:(NSZone *)zone;
Run Code Online (Sandbox Code Playgroud)
如果我打电话,编译器会在NSHour内部发出警告[self stringValue].但不是methodcall time1:[[self.H1time copy] stringValue]
我看到这个错过只是因为在碰撞后进行了密集测试.
我希望编译器阻止我这样的错误调用.我怎么能这样做?
一些测试表明编译器可能会在上述情况下发出警告:
NSHour *titi = [NSHour hourWithString:@"00:00:00"];
id toto = [titi copy];
NSString *str2 = [toto doThis]; --- Warning : "No doThis Method found"
Run Code Online (Sandbox Code Playgroud)
另一个测试:
NSHour *titi = [NSHour hourWithString:@"00:00:00"];
NSString *str3 = [[titi copy] doThis]; --- Warning : "No doThis Method found"
Run Code Online (Sandbox Code Playgroud)
小智 6
如果您希望编译器向您发出警告,请将返回的对象强制-copy转换为您期望的类型,例如
[(NSHour *)[self.H1time copy] stringValue]
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,我不会为我的类使用NS前缀,因为它是Apple使用的前缀.)
正如其他人所说,-copy声明为返回类型的值id.由于id表示通用对象,因此编译器没有关于返回值可以响应哪些选择器的任何信息.它确实知道存在一个stringValue选择器(因为一些Cocoa类声明了-stringValue方法),所以它接受了.
但我已经超越-copyWithZone:了返回NSHour*!
如果您需要自定义复制行为,这-copy是正确的做法,因为它只是一种调用的方便方法-copyWithZone:.但是,如上所述,您的代码将调用-copy,但尚未重写以返回NSHour *.
如果我也覆盖-copy以便它返回NSHour*怎么办?
然后编译器会知道这一点并在你尝试发送包含没有相应方法的选择器的消息时警告你NSHour.
我应该这样做吗?
嗯,在大多数情况下,不是真的.
你有没有想过为什么所有覆盖-init返回的例子id而不是类类型?发生这种情况是因为Objective-C运行时为给定的选择器创建单个方法描述.因此,具有相同选择器(即,相同方法名称)的不同类中的方法应共享相同的参数类型和返回类型.
因此,从运行时的角度来看,选择器init被描述为具有该名称和返回类型的方法id.类似地,选择器copy被描述为具有该名称和返回类型的方法id.如果在具有不同返回类型或参数类型的方法中重用选择器名称,则会使运行时系统混乱,这可能导致崩溃或数据被破坏.
话虽这么说,当您静态键入对象时,您将向编译器提供信息,以便它知道哪些方法可用,并且它将使用适当的方法,而不管其他类中具有不同返回类型和参数类型的方法.
cocoabuilder.com上的这个主题有关于这个主题的更多信息,包括Greg Parker的回复,他在Objective-C运行时工作.
| 归档时间: |
|
| 查看次数: |
591 次 |
| 最近记录: |