@implementation ViewController
- (instancetype)init {
self = [super init];
if (self) {
UIImageView *imgView = [[UIImageView alloc] initwithFrame:self.view.bounds];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[self sleeps60s];
imgView.image = [UIImage imageNamed:@"img.png"];
self.view addSubview:imgView];
});
}
return self;
}
- (void)sleep60s {
sleep(60);
}
@end
问题:imgView.image = [UIImage imageNamed:@“img.png”]; 不应该在子线程修改UI
@interface TestView: UIView
@property (nonatomic, strong) NSTimer *timer);
@end
@implementation TestView
- (instancetype)init {
self = [super init];
if (self) {
_timer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer *_Nonnull timer) {
self.backgroundColor = [UIColor redColor];
}];
}
return self;
}
- (void)dealloc {
[_timer invalidate];
_timer = nil;
}
@end
问题:
1.scheduleTimerWithTimeInterval:repeats:block:方法需要在iOS10后才有效
2.self.backgroundColor = [UIColor redColor];这里会造成循环引用,所有不会走dealloc方法
答:imageNamed:会把加载过的图片放入缓存中,通常用于加载体积较小或使用频率很高的图片。
imageWithContentsOfFile:每次都从资源文件中加载图片,相对于imageNamed:加载速度更慢,但不会将图片放入缓存中,通常用于加载体积较大的图片或者使用频率很低的图片
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
[self.view addSubview:view];
view.transform = CGAffineTransformMakeRotation(M_PI/2);
NSLog(@"view.frame.size=%@", NSStringFromCGSize(view.frame.size));
NSLog(@"view.bounds.size=%@", NSStringFromCGSize(view.bounds.size));
答:
view.frame.size={50, 100}
view.bounds.size={100, 50}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if(!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
cell.contenView addSubview:label];
label.text = @"string";
return cell;
}
答:由于cell有重用机制,所以UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
cell.contenView addSubview:label];这两句代码应该放在if里面执行,不然会在每次执行tableView:cellForRowAtIndexPath:时重复添加UILabel
答:好处:不会入侵代码,可以随意修改全局的代码
坏处:引入第三方时,尤其是不开源的第三方,有可能出现方法名重复的问题,而且很难排查原因
答:
答
答
具体流程:https://mp.csdn.net/mdeditor/98973441#
答:浅拷贝:只是把对象的指针指向了同一个内存地址中
深拷贝:开辟一块新的内存地址,把内容拷贝到新的地址中,对象指针也是指向新的内存地址
1.NSUserDefaults 2.plist存储 3.归档 4.SQLite3 4.CoreData 5.keychain 6.FMDB
## 13.多线程的优点和缺点,实现多线程的方法有哪些
优点:缺点:;方法:1.NSThread 2.NSOperation 3.GCD(全称:Grand Central Dispatch)
继承树:UIButton -> UIControl -> UIView -> UIResponder -> NSObject
NSObject:所有 Objective-C 对象的基类,封装了内存管理,消息的传递机制等底层逻辑
UIResponder:定义了响应和处理事件的接口。
UIView:UIView 定义了一个屏幕上的矩形区域,以及管理这个区域内容的接口。UIView 提供了一个基本行为就是为这个矩形区域填充背景色(Background Color)。
UIControl :不要使用 UIControl 的实例,而是写 UIControl 的子类。UIControl 子类的主要工作就是将 UIResponder 收集到的复杂事件,变成简单的控制事件(UIControl Events)。而为了实现这个过程,UIControl 引入了 Target-Action 机制。
UIButton: 将 UIResponder 接受的 Events 处理成简单事件。
self方法实际上是用了get和set方法间接调用,下划线方法是直接对变量操作。两者的更深层次的区别在于,通过存取方法访问比直接访问多做了一些其他的事情(例如内存管理,复制值等), 例如如果属性在@property中属性的修饰有retain,那么当使用self.xx的时候相应属性,引用计数器由于生成了setter方法而进行加1操作,此时的retaincount为2;同时,使用 下划线是获取不到父类的属性,因为它只是对局部变量的访问。
1.自定义layout
2.重写prepareLayout方法
3.在prepareLayout方法中初始化列高度数组,cell字典信息,delegate
4.重写layoutAttributesForElementsInRect和layoutAttributesForItemAtIndexPath方法
5.设置滑动的contentSize,实现collectionViewContentSize方法
TCP是传输层协议,定义数据传输和连接方式的规范。握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。
HTTP 超文本传送协议(Hypertext Transfer Protocol )是应用层协议,定义的是传输数据的内容的规范。
HTTP协议中的数据是利用TCP协议传输的,特点是客户端发送的每次请求都需要服务器回送响应,它是TCP协议族中的一种,默认使用 TCP 80端口。好比网络是路,TCP是跑在路上的车,HTTP是车上的人。每个网站内容不一样,就像车上的每个人有不同的故事一样。
一般的埋点分为PV(界面级别的),PA(action事件级别).下边为了减少冗余,简称PV,PA。PV中的数据一般都是静态的,与业务逻辑不相关,比如进入时间,离开时间,是否进入该界面等等。
PA埋点一般都会让所有的controller都继承BaseViewController。这样左右的信息都基于一个类中,符合高聚合的表现。
PV埋点推荐MOAspect。它校于Aspect,有一个功能很重要就是支持相同的方法名注册,而Aspect是不支持不同类相同方法名注册的。
1.约束布局相对来说性能比较差(和frame比)
2.
1.使用重用标记符
2.尽量不要使用透明图层
3.尽量减少图层的个数
4.不要使用layer.cornerRadius来设置圆角,图片的话叫UI切图,其他控件使用贝塞尔曲线重画
5.如果cell不需要额外的点击事件,可以用CALayer替代UIView
6.如果cell的高度是固定的话,用tablview的属性rowHeight 来设置高度;如果是动态高度,在网络请求返回后开启子线程计算好对应的高度,用model存储起来
7.使用SDWebImage下载图片时,SDWebImageOptions选择SDWebImageLowPriority,确保tableview在滚动时依然流畅,如果图片需要压缩,在下载完成时开启子线程压缩后再渲染
8.图片尽量使用原始尺寸大小,控件宽高要是整数,避免像素不对齐的情况
9.在渲染图片的时候要考虑CPU和GPU的负载均衡,选择适当的渲染方式
Person *p1= [[Person alloc]init];
@autoreleasepool{
[p1 autorelease];
}
@autoreleasepool{
[p1 autorelease];
}
UIView是CALayer的delegate,UIView主要处理事件,CALayer负责绘制,再聊下二者在使用过程中对动画流畅性影响的注意点就superb。
ios没有多继承,可以利用类别(categories)和协议(delegate)方式来实现