天天看點

NSObject不常用方法彙總

 • +(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歸檔相關方法]

繼續閱讀