点语法
@interface PersonCell : UITableViewCell
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *birthday;
@end
当我们在实现中采用点语法去设置属性时,实质上是调用setXXX来完成这一操作的。
cell.name = @"mmq"; //等同于[cell setName:@"mmq"];
我们可以利用这个特性做其他事情:
- (void)setName:(NSString *)name {
_name = name;
nameLabel.text = name;
}
重写setName方法,当name被改变的时候,进行界面的更新。
其他
_name是实例变量,外部是不能访问一个类的实例变量的,只能通过setter和getter。
类别(Category)
1.分类是用于给原有类添加方法的,因为分类的结构体指针中,没有属性列表,只有方法列表。所以< 原则上讲它只能添加方法, 不能添加属性(成员变量),实际上可以通过其它方式添加属性> ;
2.分类中的可以写@property, 但不会生成setter/getter方法, 也不会生成实现以及私有的成员变量(编译时会报警告);
3.可以在分类中访问原有类中.h中的属性;
4.如果分类中有和原有类同名的方法, 会优先调用分类中的方法, 就是说会忽略原有类的方法。所以同名方法调用的优先级为 分类 > 本类 > 父类。因此在开发中尽量不要覆盖原有类;
5.如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定;编译器会执行最后一个参与编译的分类中的方法。
作者:CoderDancer
链接:https://www.jianshu.com/p/9e827a1708c6
用法:
@interface ClassName(CategoryName)
@end
示例:
//NSStringAdditions.h
@interface NSString (NSStringAdditions)
+ (NSString *) getAuthorNameString;
@end
//NSStringAdditions.m
@implementation NSString (NSStringAdditions)
+ (NSString *) getAuthorNameString {
return @"momingqi";
}
@end
//使用
#import "NSStringAdditions.h"
...
NSString *categoryTest = [NSString getAuthorNameString];
NSLog(@"类别测试:%@", categoryTest);
要注意的是,使用类别的方法时需要引入类别的头文件。
扩展(Extension)
- 不能为任何类声明扩展,仅适用于原始实现源代码的类。
- 扩展是添加仅特定于类的私有方法和私有变量。
- 扩展内部声明的任何方法或变量即使对于继承的类也是不可访问的。
UIKit
UIWindow:
-
视图需要显示在屏幕上,需要添加到UIWindow上;一个app中至少有一个UIWindow。
-
iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,
最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了
UIApplication生命周期:
完成创建工作:didFinishLaunchingWithOptions
applicationDidBecomeActive
上滑:applicationWillResignActive
返回桌面:applicationDidEnterBackground
回到app:applicationWillEnterForeground
applicationDidBecomeActive
杀进程:applicationWillTerminate
ViewController生命周期:
切后台的时候ViewController是不会viewDidDisappear的!
UINavigationController
导航控制器,可以轻松完成多个控制器之间的切换,其结构包含导航条(y=20)、栈顶控制器的view、导航控制器的view。导航控制器需要设置一个根控制器,一般是UIViewControler。
导航控制器作为父控制器,子控制器中的栈顶控制器作为根控制器。默认是没有的,需要手动push一个控制器或者通过构造方法指定根控制器。
- (instancetype)initWithRootViewController:(UIViewController *)rootViewController; // Convenience method pushes the root view controller without animation.
UILabel
[label sizeToFit];
使这个labelView的宽高适应文本大小:
小红点实现:
//设置小红点
_unreadCountLabel.textColor = [UIColor whiteColor];
_unreadCountLabel.backgroundColor = [UIColor redColor];
_unreadCountLabel.textAlignment = NSTextAlignmentCenter;
_unreadCountLabel.layer.masksToBounds = YES; //需要YES,否则没有圆角效果
_unreadCountLabel.layer.cornerRadius = 10; //为宽度的一半
UILayer
UIView继承自UIResponder ,负责接收用户事件和显示内容。
UIView的内部拥有一个layer属性:
@property(nonatomic,readonly,retain) CALayer *layer;
当UIView需要显示在屏幕上时,会调用自身的drawRect方法,把内容绘制在layer上;绘制完毕后,系统把layer的内容拷贝到屏幕上,这就完成了内容的显示。