ios开发基础工具(一)| 青训营笔记

55 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第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语言

如何查看系统头文件

  1. 对NSObject关键字上,cmd+点击,跳转到定义
  2. cmd+shift+o,搜索框搜索NSObject.h

分配内存空间,初始化

  1. allocinit
    alloc对对象分配内存并返回空的实例
    init对实例方法初始化
@interface NSObject <NSObject>{
+(instancetype)alloc;
-(instancetype)init;
}

❓+号代表类别方法,不需要实例就能呼叫;-号需要实例
❗️这里比较好奇什么是(instancetype)并上网搜集了相关资料:
instancetype意思为实例化,instancetype与和id一样,都可以指向一个继承了Object(或者NSObject)类的对象。
instancetype只能作为方法返回值,会返回该方法所在的类的实例化对象。
根据 Cocoa 的命名规则,满足下述命名规则的方法应该返回该方法所在类的实例化对象,这些方法被称为是关联返回类型的方法:

  • 以 alloc 或 new 开头的类方法
  • 以 autorelease、init、retain 或 self 开头的实例方法。

引用:instancetype资料来源

网址:blog.csdn.net/qq_36557133…

另外,将allocinit写在一起的格式为[[NSObject alloc] init]
ByteDancer *byteDancer1 = [[ByteDancer alloc] init];

  1. 用new代替alloc + init, 如
@interface NSObject <NSObject>{
+(instancetype)new;
}

ByteDancer *byteDancer1 = [ByteDancer new];
❗️区别:alloc分配内存的时候使用了zone(给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度)
为什么不推荐使用new?使用new的话,初始化方法被固定死只能调用init
【后面的资料看不懂啦!贴个网址吧!】

引用:[className new] 和 [[className alloc] init] 的区别

网址:www.jianshu.com/p/0c2f9aa74…

发送消息(方法调用)

performSelector调用,

  1. 方法通过Runtime添加,编译时不存在
  2. 对象有实现私有方法,没有声明在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] 的区别

网址:juejin.cn/post/712271…

类关系判断

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

网址:www.jianshu.com/p/bfc9f0e44…

这一课太多啦,剩下的下一篇再写