速度
2018-04-08 23:04 dengchaojie_learner 阅读(182) 评论(0) 编辑 收藏 举报https://www.jianshu.com/p/5b81bccd643d
nit 方法和快捷构造方法的返回类型最好都用 instancetype
@synthesize 合成实例变量的规则,有以下几点:
-
如果指定了成员变量的名称,会生成一个指定的名称的成员变量,
-
如果这个成员已经存在了就不再生成了.
-
如果是
@synthesize foo;
还会生成一个名称为foo的成员变量,也就是说:
如果没有指定成员变量的名称会自动生成一个属性同名的成员变量,
- 如果是
@synthesize foo = _foo;
就不会生成成员变量了.
@synthesize lastName = _lastName;
什么情况下不会autosynthesis(自动合成)?
- 同时重写了 setter 和 getter 时
- 重写了只读属性的 getter 时
- 使用了 @dynamic 时
- 在 @protocol 中定义的所有属性
- 在 category 中定义的所有属性
- 重载的属性
当你在子类中重载了父类中的属性,你必须 使用 @synthesize
来手动合成ivar。
// 对象的内存销毁时间表
// http://weibo.com/luohanchenyilong/ (微博@iOS程序犭袁)
// https://github.com/ChenYilong
// 根据 WWDC 2011, Session 322 (36分22秒)中发布的内存销毁时间表
1. 调用 -release :引用计数变为零
* 对象正在被销毁,生命周期即将结束.
* 不能再有新的 __weak 弱引用, 否则将指向 nil.
* 调用 [self dealloc]
2. 子类 调用 -dealloc
* 继承关系中最底层的子类 在调用 -dealloc
* 如果是 MRC 代码 则会手动释放实例变量们(iVars)
* 继承关系中每一层的父类 都在调用 -dealloc
3. NSObject 调 -dealloc
* 只做一件事:调用 Objective-C runtime 中的 object_dispose() 方法
4. 调用 object_dispose()
* 为 C++ 的实例变量们(iVars)调用 destructors
* 为 ARC 状态下的 实例变量们(iVars) 调用 -release
* 解除所有使用 runtime Associate方法关联的对象
* 解除所有 __weak 引用
* 调用 free()
NSPredicate
CoreData
堆和栈的区别
怎样使用performSelector传入3个以上参数,其中一个为结构体
测试:
my_struct str = (my_struct)(malloc(sizeof(my_struct)));
str->a = 1;
str->b = 2;
HYBObject *obj = [[HYBObject alloc] init];
obj.arg1 = @"arg1";
obj.arg2 = @"arg2";
obj.arg3 = str;
[self performSelector:@selector(call:) withObject:obj];
// 在回调时得到正确的数据的
- (void)call:(HYBObject *)obj {
NSLog(@"%d %d", obj.arg3->a, obj.arg3->b);
}
UITableViewCell上有个UILabel,显示NSTimer实现的秒表时间,手指滚动cell过程中,label是否刷新,为什么?
NSTimer
对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)
添加到主运行循环中的时候, ScrollView滚动过程中会因为mode的切换,而导致NSTimer
将不再被调度。当我们滚动的时候,也希望不调度,那就应该使用默认模式。但是,如果希望在滚动时,定时器也要回调,那就应该使用common mode。解决cell重用的问题
UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:defineString]
修改为:UITableViewCell *cell = [tableview cellForRowAtIndexPath:indexPath];
这样就解决掉cell重用机制导致的问题。
造成环的根本原因,即堆对堆的引用是产生循环引用的根本原因。
** 键路径 **
键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。例如:[self setValue:kShiXiaoColor forKeyPath:@"_placeholderLabel.textColor"];//self是UITextField
如何高性能的给UIImageView加个圆角?(不准说layer.cornerRadius!)
这题讨论的最多,还有说美工切图就搞定的。答主在项目里做过圆角头像的处理,里面的坑还真不少。cornerRadius会导致offscreen drawing有性能问题,美工切图无法适用有背景图的场景,即使加上shouldRasterize也有cache实效问题。正确的做法是切换到工作线程利用CoreGraphic API生成一个offscreen UIImage,再切换到main thread赋值给UIImageView。这里还涉及到UIImageView复用,圆角头像cache缓存(不能每次都去绘制),新旧头像替换等等逻辑。还有其他的实现方式,但思路离不开工作线程与主线程切换。
另外一个准则是,可以重复的交互,比如取个数据,跳个页面, 用GET.
不可以重复的操作, 比如创建一个条目/修改一条记录, 用POST, 因为POST不能被缓存,所以浏览器不会多次提交。
对于C++来说,虚函数完成了其动态多态的实现。
super 是一个 Magic Keyword, 它本质是一个编译器标示符,和 self 是指向的同一个消息接受者!他们两个的不同点在于:super 会告诉编译器,调用 class 这个方法时,要去父类的方法,而不是本类里的。
48. KVC的keyPath中的集合运算符如何使用?
- 必须用在集合对象上或普通对象的集合属性上
- 简单集合运算符有@avg, @count , @max , @min ,@sum,
- 格式 @"@sum.age"或 @"集合属性.@max.age"
19. 试比较Swift和Objective-C中的初始化方法(init)有什么异同?
一言以蔽之,Swift中的初始化方法更加严格和准确。
-
Objective-C中,初始化方法无法保证所有成员变量都完成初始化;编译器对属性设置并无警告,但是实际操作中会出现初始化不完全的问题;初始化方法与普通方法并无实际差别,可以多次调用。
-
Swift中,初始化方法必须保证所有optional的成员变量都完成初始化。同时新增convenience和required两个修饰初始化方法的关键词。convenience只是提供一种方便的初始化方法,必须通过调用同一个类中designated初始化方法来完成。required是强制子类重写父类中所修饰的初始化方法。
KVO“手动触发”的使用场景是什么?一般我们只在希望能控制“回调的调用时机”时才会这么做。
而“回调的调用时机”就是在你调用 didChangeValueForKey:
方法时。
3. 请说明并比较以下关键词:atomatic, nonatomic
-
atomic修饰的对象会保证setter和getter的完整性,任何线程对其访问都可以得到一个完整的初始化后的对象。因为要保证操作完成,所以速度慢。它比nonatomic安全,但也并不是绝对的线程安全,例如多个线程同时调用set和get就会导致获得的对象值不一样。绝对的线程安全就要用关键词synchronized。
-
nonatomic修饰的对象不保证setter和getter的完整性,所以多个线程对它进行访问,它可能会返回未初始化的对象。正因为如此,它比atomic快,但也是线程不安全的。
Swift 支持 map, reduce, filter, flatmap
https://www.cnblogs.com/muzijie/p/6542650.html
避免图层混合
- 确保控件的opaque属性设置为true,确保backgroundColor和父视图颜色一致且不透明
- 如无特殊需要,不要设置低于1的alpha值
- 确保UIImage没有alpha通道
避免临时转换
- 确保图片大小和frame一致,不要在滑动时缩放图片
- 确保图片颜色格式被GPU支持,避免劳烦CPU转换
慎用离屏渲染
- 绝大多数时候离屏渲染会影响性能
- 重写drawRect方法,设置圆角、阴影、模糊效果,光栅化都会导致离屏渲染
- 设置阴影效果是加上阴影路径
- 滑动时若需要圆角效果,开启光栅化