Objective-C的一些小知识点

2018-05-26  本文已影响21人  7分醉

1.isMemberOfClass 和 isKindOfClass 联系与区别

isKindOfClass 用于确定一个对象是一个类的成员,或者是否是一个类的派生类的成员
isMemberOfClass 用于确定一个对象是否是一个类的成员

2.id和instencetype的区别

instencetype 可以返回方法所在类的类型
比如:

@interface TTTestTool : NSObject
+ (id)testToolWithNowTime;
+ (instancetype)testToolWithNowTime;
@end

+ (instancetype)testToolWithNowTime;该方法返回的就是TTTestTool类型的。
+ (id)testToolWithNowTime;返回的就是ID类型的。

需要注意的是:

根据Cocoa的命名规则,满足下述规则的方法:
(1)类方法中,以alloc或new开头
(2)实例方法中,以autorelease,init,retain或self开头
会返回一个方法所在类类型的对象,这些方法就被称为是关联返回类型的方法。换句话说,这些方法的返回结果以方法所在的类为类型。

也就是说如果你写了一个-(id)init;方法,虽然用了id,但还是返回的是方法所属类的类型。

3. SEL和IMP是什么,有什么区别

SEL是方法编号
IMP是函数指针,指向方法地址

联系:IMP可以通过SEL来构造出来,同一个SEL可以对应多个IMP。因为同一个SEL在不同的对象中对应不同的方法实现。

举个例子:

//在 TTTestTool和TTAlgorithmTool都有function1方法
  TTTestTool *ttTest = [TTTestTool new];
 SEL methId = @selector(function1);
 IMP imp1 = [ttTest methodForSelector:methId];
   imp1();
        
 TTAlgorithmTool *ttAlgo = [TTAlgorithmTool new];
 IMP imp2 = [ttAlgo methodForSelector:methId];
 imp2();

//log
// 这里是TTTestTool类~~~
// 这里是TTAlgorithmTool类~~

总结:通过同一个SEL构造出连个IMP,分别调用到不同类中的方法

4.如何实现准确定时器

有篇文章写的很好:http://blog.lessfun.com/blog/2016/08/05/reliable-timer-in-ios/
这里贴出代码:

上一篇 下一篇

猜你喜欢

热点阅读