先上代码(xcode 4.5):
// GGObjectA.h #import <Foundation/Foundation.h> @interface GGObjecA : NSObject - (NSNumber *)something;@end // GGObjectB.m #import "GGObjecA.h" @implementation GGObjecA - (NSNumber *)something{ return@1 ; } - (void)dealloc { NSLog(@"[A]the something:%@", self.something); [super dealloc]; }@end // GGObjectB.h #import <Foundation/Foundation.h> #import "GGObjecA.h" @interface GGObjectB : GGObjecA @property(nonatomic, retain) NSString *something;@end // GGOBjectB.m @implementation GGObjectB - (void)dealloc { NSLog(@"[B]the something:%@", self.something); [super dealloc]; }@end测试运行的代码
GGObjectB *gg = [[GGObjectBalloc] init]; // 这里的tmp是特意搞复杂一点为了,体现测试效果 NSString *tmp = [[NSStringalloc] initWithFormat:@"%@", @"2"]; gg.something = tmp; [tmp release]; [gg release];打印什么?
- (NSString *)something; - (void)setSomething:(NSString *)aSomething;那么,something方法就是一个只有返回值不同的重载函数(原谅我用C++的术语,OBJC叫消息吧)。
只有返回值不同的函数重载不应该被允许才对。
更正:这种情况不属于overload而是overwrite,重写是允许不同返回类型的。
2. 眼睛锐利的人肯定看出来上面GGObjectB是有内存泄露的,因为something是retain的,所以应该在dealloc的时候release一下。 那么,我们就release一下吧,GGObjectB的代码就变成这样:- (void)dealloc { [_something release]; NSLog(@"[B]the something:%@", self.something); [super dealloc]; }再跑一下,阿!非法操作了。