• +(void)load
import進時就調用。
父類優于子類,類優于類别。
• +(void)initialize
類的第一個方法調用前調用。+(void)load不當成第一個方法。
父類優于子類調用。
http://www.cnblogs.com/ider/archive/2012/09/29/objective_c_load_vs_initialize.html。
• copy
需要響應<NSCopying>協定的類才可以調用copy方法。即實作
-(id)copyWithZone:(NSZone *)zone
{
MyObj*copy = [[[self class] allocWithZone:zone] init];
……
return copy;
}
• +(BOOL)isSubclassOfClass:(Class)aClass
是否子類
• +(BOOL)instancesRespondToSelector:(SEL)aSelector
類是否響應此方法[?不包括類方法]
•+(BOOL)conformsToProtocol:(Protocol *)aProtocol
類是否響應此協定
• -(void)doesNotRecognizeSelector:(SEL)aSelector
當類不能響應aSelector方法時由系統調用。當要使類的某個方法失效時,也可以手動調用,代碼示例如下:
-(id)copy
{
[selfdoesNotRecognizeSelector:_cmd];
}
其中_cmd為每個方法的隐藏參數,代表@selector(copy)的值
• hash 哈希值
每個對象都有一個固定的哈希值,表現形式為NSInteger。Hash相等,isEqual也相等。
• -(BOOL)isProxy
是否代理類。NSProxy類也是和NSObject一樣的根類,響應<NSObject>協定。
NSProxy類通過
-(NSMethodSignature*)methodSignatureForSelector:(SEL)sel
和
• (void)forwardInvocation:(NSInvocation*)invocation
方法實作代理。這種方式可以實作多重繼承。
但其實NSObject類也有這兩個方法,NSObject子類也可以實作消息轉發。?mark,NSProxy是否有必要存在??
http://blog.csdn.net/onlyou930/article/details/7548476
-(id)forwardingTargetForSelector:(SEL)sel
{
if([objectrespondsToSelector:sel])
returnobject;
returnnil;
}
forwardingTargetForSelector的作用相當于methodSignatureForSelector和forwardInvocation之和。
•- (IMP)methodForSelector:(SEL)aSelector
取到aSelector方法的位址。IMP是一個address類型。
方法:
-(void)fun:(NSInteger)abc
{
NSLog(@"fun:%d",(int)abc);
}
執行代碼:
void(*setter)(id,SEL,NSInteger);
setter=(void(*)(id,SEL,NSInteger))[selfmethodForSelector:@selector(fun:)];
setter(self,@selector(fun:),2000);
結果:fun:2000
優點:每個方法,都有兩個隐藏參數,id和SEL。Id是對象名,SEL是方法名。每次執行都需要根據id和SEL找到相應的位址,再執行計算。
setter=(void(*)(id,SEL,NSInteger))[selfmethodForSelector:@selector(fun:)];
這句代碼執行後,setter儲存了此方法的位址。當重複執行很多次一個方法時,通過setter可以減少查位址的操作,提升效率。
+(IMP)instanceMethodForSelector:(SEL)aSelector是相應的類方法,aSelector隻能是執行個體方法,不能是類方法。
• -(id)autoContentAccessingProxy [?mark]
•+ (BOOL)resolveInstanceMethod:(SEL)name
動态綁定,優于forwarding和respondsToSelector:調用。
voiddynamicMethodIMP(id self, SEL _cmd)
{
//implementation ....
}
+(BOOL) resolveInstanceMethod:(SEL)aSEL
{
if(aSEL == @selector(resolveThisMethodDynamically))
{
class_addMethod([selfclass], aSEL, (IMP) dynamicMethodIMP, "[email protected]:");
returnYES;
}
return[super resolveInstanceMethod:aSel];
}
可以調用[objectresolveThisMethodDynamically]方法;來調用dynamicMethodIMP函數。
http://www.onevcat.com/2012/04/objective-c-runtime/
class_addMethod的相關介紹:http://longtimenoc.com/archives/ios在運作時為類添加方法
meta
class
http://blog.csdn.net/weiqubo/article/details/7367073
object-c運作時
http://www.linuxidc.com/Linux/2012-02/54989.htm
• +(void)setVersion:(NSInteger)aVersion
設定version。歸檔時有用。
14.– awakeAfterUsingCoder:
– classForCoder
– classForKeyedArchiver
+ classFallbacksForKeyedArchiver
+ classForKeyedUnarchiver
– replacementObjectForCoder:
– replacementObjectForKeyedArchiver:
[?mark歸檔相關方法]