iOS知识点拾遗I

文章也同时在简书更新

引言

本文章主要收录一些在iOS日常中司空见惯、但是仔细咀嚼别有深意的,以及容易被大家忽视的细节。待扩充到一定量会考虑分类出第二篇文章。

拾遗

基本的基本

  • OC强调的消息传递,而非方法,正是这一点使其区别于Java等语言。

类声明

  • 实例变量自动声明为@protected,其他的可能的可见类型还包括@public@private

@property属性

  • 参数nonatomic:此主要为线程访问行为,当采用atomic时,访问以序列方式进行,而nonatomic则支持并行处理。

创建对象

  • 对象通过alloc分配内存空间,对应内存赋值后可得到一个对象实例,随后可使用init方法。
  • 通过alloc方法创建的对象,包含一个自身的引用。如果内存分配过程中出现了问题(例如内存空间不足),则可以通过安全的方法检测当前引用是否安全。如下所示:
    1
    2
    3
    4
    5
    6
    if (self) {
    // everything is OK
    }
    else {
    // error: self = nil
    }

如果未继承NSObject且期望包含父类的构造方法,则可以使用:

1
2
3
if (self = [super init]) {
...
}

  • nil意指当前对象不存在,并包含false值(需要注意,nil不同于NULL,因而nil可作为有效参数加以使用)。
  • 形如MyObject *myObject = [[MyObject alloc] init],其中的*号表明对应变量为指针。通常,对象通过其内存位置加以引用。例如,myObject表示为指针变量,因而指向内存位置0x12345678
  • id数据类型已经定义为指针结构:
    1
    typedef struct objc_object {Class isa;} *id

因而*号应针对id予以忽略。

内存管理

  • 某些时候,当与线程协同工作时,往往无法确切地知晓对象地生命周期于何时结束。对此,Objective-C语言提供了NSAutoreleasePool类。

NSObject

  • 当检测相关类是否存在时,可以使用NSClassFromString()函数。如对应类不存在,则该函数返回nil

  • 如相关类存在,还可以进一步查询。继承自NSObject的各个类包含两个方法,即[Class instanceRespondToSelector:SEL][instance respondsToSelector:SEL]。取决于查询方法是否存在,方法返回YESNO

UIWindow相关

  • makeKeyAndVisible 方法确保父窗口处于活动状态,并可包含触摸事件。
  • AppDelegate中操作UIWindow可以参照下述代码的三个步骤:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// setp1: 设置keyWindow
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self.window makeKeyAndVisible];
// step2: 设置根控制器
rootVC = [ViewController new];
self.window.rootViewController = rootVC;
// step3: 显示主窗口
mainView = [[MainView alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
mainView.backgroundColor = [UIColor grayColor];
[self.window addSubview:mainView];
return YES;
}
  • 更多细节,我推荐看一下这篇文章:UIWindow in iOS,博主文章不多,但都是精品。

UIView绘图相关

  • addSubview会触发UIView的drawRect方法。
  • setNeedsDisplay消息将触发UIView中的drawRect:方法,一个常见的使用案例就是:当屏幕发生旋转时重绘View以正确显示。

微信公众号

第一时间获取最新内容,欢迎关注微信公众号:「洛斯里克的大书库」。
微信公众号「洛斯里克的大书库」

周鶏🐣(Kimiko) wechat
拿起手机扫一扫,欢迎关注我的个人微信公众号:「洛斯里克的大书库」。
坚持原创技术分享,您的支持将鼓励我继续创作!