您的位置:首页 > 移动开发 > Objective-C

ios学习路线—Objective-C(NSObject)

2016-06-16 10:57 477 查看
继承关系图



Initalizing a Class

一个类的实例在使用前需要先初始化,initilalize在一个类中只被调用一次。

+ (void)initialize


只要一个类或者Categories只要被添加到Objective-C的运行时就会调用此方法;加载后实现这个方法来执行类的特殊行为。

+ (void)load


Creating,Copying,and Deallocation Objects

返回一个新的实例,必须和init一起使用

+ (id)alloc


返回一个新的实例,必须和init一起使用(该方法是历史遗留,NSZone已经被弃用)

+ (id)allocWithZone:(NSZone *)zone


当一个新对象申请了内存空间,就会立刻调用init方法来初始化这个对象。

在NSObject类中定义的init方法没有初始化,只是返回了self指针。

- (id)init


返回一个通过copyWithZone:创建的实例。

- (id)copy


当你需要一个实现NSCopying协议的对象时,可以使用此方法。例如,把一个类对象作为NSDictionary的key值。

+ (id)copyWithZone:(NSZone *)zone


当zoon为nil的时候,通过NSMutableCopying 协议方法 mutableCopyWithZone:创建的对象。

对一个采用 NSMutableCopying协议的类来说这是一个方便的方法。如果没有实现mutableCopyWithZone:的话就会抛异常。

- (id)mutableCopy


雷同copyWithZone:(NSZone *)zone。

+ (id)mutableCopyWithZone:(NSZone *)zone


分配一个实例新的内存空间,调用init方法,最后返回一个初始化过的对象。

+ (id)new


* Identifying Classes*

返回一个class对象

+ (Class)class


返回一个类的父类Class

+ (Class)superclass


判断一个类是否是另一个类的子类

+ (BOOL)isSubclassOfClass:(Class)aClass


Testing Class Functionality

判断一个实例变量是否能够调用一个类的方法

+ (BOOL)instancesRespondToSelector:(SEL)aSelector


Testing Protocol Conformance

判断一个接收者是否能够遵从一个给定的protocol。一个接收者遵从一个协议,可以是直接接受这个协议,也可以继承一个已经接受这个协议的类。

+ (BOOL)conformsToProtocol:(Protocol *)aProtocol


Obtaining Information About Methods

定位并且返回接收者实现该方法的地址,因此可以作为一个方法来调用。

传入参数aSelector必须是有效切非空的,可以用respondsToSelector: 这个方法提前判断。

- (IMP)methodForSelector:(SEL)aSelector


示例:

@interface TestIMP : NSObject

- (void)saySomething;

@end

@implementation TestIMP

- (void)saySomething
{
NSLog(@"invoke saySomething");
}

@end

// For Test
TestIMP *testIMP = [[TestIMP alloc] init];

SEL aSelector = @selector(saySomething);

IMP imp = [testIMP methodForSelector:aSelector];

imp(testIMP, aSelector);


同- (IMP)methodForSelector:(SEL)aSelector

+ (IMP)instanceMethodForSelector:(SEL)aSelector


返回NSMethodSignature对象,这个对象包含被标示的实例方法的描述。

+ (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector


同+ (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector


Describing Objects

以字符串的形式返回对接收者类内容的描述。

+ (NSString *)description


Discardable Content Proxy Support

创建一个接收者对象的代理。

- (id)autoContentAccessingProxy


Sending Messages

延时调用在当前线程使用默认模式的方法

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay


延时调用在当前线程使用特定模式的方法

anArgument

如果想把需要的数据传给Selector方法中,需要设置anArgument参数,对应Selector就应是带参数的方法

modes

如果这个参数为空或者数组中没有数据,那么就不会调用Selector方法。

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes


示例:

[self performSelector:@selector(doSomething:)
withObject:[NSArray arrayWithObjects:@"AObject", @"BObject", nil]
afterDelay:1.0
inModes:[NSArray arrayWithObjects:NSDefaultRunLoopMode, nil]];

- (void)doSomething:(id)sender
{
NSLog(@"invoke doSomething");

NSLog(@"%@", sender);
}


以默认的方式在主线程中调用一个方法

wait

如果设置为YES那么将阻塞当前线程,设置为NO将立刻调用Selector方法

如果当前线程也是主线程,那么设置为YES,Selector方法将会立即调用,arg信息也会立即传输。

这个方法是不可以被取消的,如果想调用取消方法可以使用performSelector:withObject:afterDelay:或者performSelector:withObject:afterDelay:inModes:方法

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait


同- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait,只是多了一个可以选择RunLoop模式的参数。

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)waitmodes:(NSArray *)array


在指定的线程中执行指定的Selector方法。

其它内容与第3条相同。

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thread withObject:(id)arg waitUntilDone:(BOOL)wait


是多了一个可以选择RunLoop模式的参数,其它与第5条相同。

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thread withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array


在一个新的后台线程中调用Selector方法

- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg


取消执行先前用performSelector:withObject:afterDelay:这个方法创建的实例方法。取消的只是当前RunLoop里执行的方法而不是所有RunLoop.

performSelector:onThread:withObject:waitUntilDone:和performSelectorInBackground:withObject:执行的方法不能被取消。

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget


同第8个方法,只是多了Selector方法和要传递的数据。

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument


Forwarding Messages

返回消息被第一个转发的对象。

- (id)forwardingTargetForSelector:(SEL)aSelector

- (void)forwardInvocation:(NSInvocation *)anInvocation


Dynamically Resolving Methods

动态的为一个类方法提供了一个SEL实现方法。返回YES表明这个方法已经找到并被添加到接收者,否则返回NO。

+ (BOOL)resolveClassMethod:(SEL)name


动态的为一个实例方法提供了一个SEL实现方法。返回YES表明这个方法已经找到并被添加到接收者,否则返回NO。

+ (BOOL)resolveInstanceMethod:(SEL)name


示例

@interface Person : NSObject
{
NSString *name;
float weight;
}

@property (retain,readwrite) NSString* name;
@property (readonly)float weight;
@property float height;

-(Person*) initWithWeight: (int) weight;
-(void) print: (NSString*) str;
@end

void dynamicMethod(id self,SEL _cmd,float w)
{
printf("dynamicMethod-%s\n",[NSStringFromSelector(_cmd) cStringUsingEncoding:NSUTF8StringEncoding]);
printf("%f\n",w);
}

@implementation Person
@synthesize name;
@synthesize weight;

@dynamic height; // 注意这里
// 在实现类中使用了@dynamic指令

-(Person*) initWithWeight: (int) w
{
self=[super init];
if (self)
{
weight=w;
}

return self;
}

-(void) print: (NSString*) str
{
NSLog(@"%@%@",str,name);
}

+ (BOOL) resolveInstanceMethod: (SEL) sel
{
NSString *methodName=NSStringFromSelector(sel);
BOOL result=NO;

//看看是不是我们要动态实现的方法名称
if ([methodName isEqualToString:@"setHeight:"])
{
class_addMethod([self class], sel, (IMP) dynamicMethod,"v@:f");
result=YES;
}

return result;
}

+ (BOOL)resolveClassMethod:(SEL)sel
{
NSString *methodName=NSStringFromSelector(sel);
BOOL result=NO;

//看看是不是我们要动态实现的方法名称
if ([methodName isEqualToString:@"setHeight:"])
{
class_addMethod([self class], sel, (IMP) dynamicMethod,"v@:f");
result=YES;
}

return result;
}

-(void) dealloc
{
[self setName:nil];
[super dealloc];
}


Error Handling

处理不被接收者识别的信息。

- (void)doesNotRecognizeSelector:(SEL)aSelector


Archiving

- (id)awakeAfterUsingCoder:(NSCoder *)aDecoder

- (Class)classForCoder

- (Class)classForKeyedArchiver

+ (NSArray *)classFallbacksForKeyedArchiver

+ (Class)classForKeyedUnarchiver

- (id)replacementObjectForCoder:(NSCoder *)aCoder

- (id)replacementObjectForCoder:(NSCoder *)aCoder

+ (void)setVersion:(NSInteger)aVersion

+ (NSInteger)version


Deprecated Methods

- (void)finalize


Identifying Classes

返回实例变量的Class对象,与 + (Class)class 相同。

- (Class)class


返回父Class,与 +(Class)superclass相同。

- (Class)superclass


Identifying and Comparing Objects

判断两个对象是否相等。

- (BOOL)isEqual:(id)anObject


返回一个整数,可以在哈希表结构中当作一个地址。如果两个变量isEqual:相等,那么他们的hash值一定相同。

- (NSUInteger)hash


返回自己。

- (id)self


Testing Object Inheritance, Behavior, and Conformance

判断一个变量是否是一个给定类的变量或者任何一个继承该类的类变量。

- (BOOL)isKindOfClass:(Class)aClass


判断某一个实例是否是这个类的实例变量。

- (BOOL)isMemberOfClass:(Class)aClass


判断某一个对象是否可以执行这个方法

- (BOOL)respondsToSelector:(SEL)aSelector


同+ (BOOL)conformsToProtocol:(Protocol *)aProtocol

- (BOOL)conformsToProtocol:(Protocol *)aProtocol


Describing Objects

同 + (NSString *)description

- (NSString *)description


同+ (NSString *)debugDescription

- (NSString *)debugDescription


Sending Messages

- (id)performSelector:(SEL)aSelector

- (id)performSelector:(SEL)aSelector withObject:(id)anObject

- (id)performSelector:(SEL)aSelector withObject:(id)anObject withObject:(id)anotherObject


Identifying Proxies

判断一个实例不继承自NSObject,如果返回NO就是继承自NSObject,反之返回YES

- (BOOL)isProxy


Obsolete Methods

增加接收者的引用计数。

- (id)retain


减少接收者的引用计数。

- (oneway void)release


Decrements the receiver’s retain count at the end of the current autorelease pool block. (required)

- (id)autorelease


Zones are deprecated and ignored by most classes that have it as a parameter. (required)

- (NSUInteger)retainCount

- (NSZone *)zone
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: