这是我参与「第四届青训营 」笔记创作活动的第2天
iOS系统框架
框架Frameworks
通用的,可复用,具备特定功能的软件或是环境,可能包含代码库,API文件,或是一些工具的集合体
iOS框架 iOS Frameworks
一个有层级的目录,他将 动态代码库,nib files,图片文件,头文件和参考文件 全部封装成一个单一的资源包,多个程序之间可以同时共用它,并被程序调用去执行某个任务
后坠为 .framework 的文件包,里面包含了与其相关的文件,程序在启动时会将它加载进内存
头文件(Headers)、可执行文件(Unix executable)、资源文件(Resources的文件夹)
框架分层
Cocoa Touch (触摸层),Media (媒体层),Core Services (核心服务层),Core OS (操作系统层)
Foundation框架
引入Foundation.h(框架伞头文件)
import <Foundation/Foundation.h>//引入头文件
等于把框架中公开类的头文件,即所有类的声明都引入了,称Umbrella Header 伞头文件
NSObject类
//NSObject.h
@protocol NSObject
//...
@end
@interface NSObject <NSObject>{
//...
}
@interface NSObject <NSObject>这句话中,前一个NSObject是类(所有类的根类),后一个NSObject是协议(@protocol NSObject)
适应oc语言
如何查看系统头文件
- 对NSObject关键字上,cmd+点击,跳转到定义
- cmd+shift+o,搜索框搜索NSObject.h
分配内存空间,初始化
alloc和init
alloc对对象分配内存并返回空的实例
init对实例方法初始化
@interface NSObject <NSObject>{
+(instancetype)alloc;
-(instancetype)init;
}
❓+号代表类别方法,不需要实例就能呼叫;-号需要实例
❗️这里比较好奇什么是(instancetype)并上网搜集了相关资料:
instancetype意思为实例化,instancetype与和id一样,都可以指向一个继承了Object(或者NSObject)类的对象。
instancetype只能作为方法返回值,会返回该方法所在的类的实例化对象。
根据 Cocoa 的命名规则,满足下述命名规则的方法应该返回该方法所在类的实例化对象,这些方法被称为是关联返回类型的方法:
- 以 alloc 或 new 开头的类方法
- 以 autorelease、init、retain 或 self 开头的实例方法。
引用:instancetype资料来源
另外,将alloc和init写在一起的格式为[[NSObject alloc] init]
如ByteDancer *byteDancer1 = [[ByteDancer alloc] init];
- 用new代替alloc + init, 如
@interface NSObject <NSObject>{
+(instancetype)new;
}
ByteDancer *byteDancer1 = [ByteDancer new];
❗️区别:alloc分配内存的时候使用了zone(给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度)
为什么不推荐使用new?使用new的话,初始化方法被固定死只能调用init
【后面的资料看不懂啦!贴个网址吧!】
引用:[className new] 和 [[className alloc] init] 的区别
发送消息(方法调用)
performSelector调用,
- 方法通过Runtime添加,编译时不存在
- 对象有实现私有方法,没有声明在interface,使用
performSelector调用(搭配respondsToSelector确认对象是否有响应消息
@protocol NSObject
/** 发送指定的消息给对象, 返回消息执行结果(相当于方法调用) */
- (id)performSelector:(SEL)aSelector;
/** 发送带一个参数的消息给对象, 返回消息执行结果(相当于方法调用) */
- (id)performSelector:(SEL)aSelector withObject:(id)object;
/** 判断对象是否能够调用给定的方法 */
- (BOOL)respondsToSelector:(SEL)aSelector;
@end
//**
作者:青训营官方账号
链接:https://juejin.cn/post/7122718911552258079/
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
看例子!
引用:[className new] 和 [[className alloc] init] 的区别
类关系判断
isKindOfClass,isMemberOfClass,conformsToProtocol
❗️这里我有点迷糊,于是又又又又查了资料
- (BOOL)isKindOfClass:(Class)aClass
Returns a Boolean value that indicates whether the receiver is an instance of given class or an instance of any class that inherits from that class. (required)
返回一个BOOL类型的值,表示调用该方法的类 是否是 参数类 或者 继承于参数类
- (BOOL)isMemberOfClass:(Class)aClass
Returns a Boolean value that indicates whether the receiver is an instance of a given class. (required)
返回一个BOOL类型的值,表示调用该方法的类 是否是 参数类
//注意这是一个类方法
+ (BOOL)isSubclassOfClass:(Class)aClass
Returns a Boolean value that indicates whether the receiving class is a subclass of, or identical to, a given class.
返回一个BOOL类型的值,表示调用该方法的类 是不是 参数类的一个子类 或者 是这个类的本身
引用:isKindOfClass、isMemberOfClass和isSubClasssOfClass
这一课太多啦,剩下的下一篇再写