if
(
_noLabel
==
nil
) {
UILabel
*label = [[
UILabel
alloc
]
initWithFrame
:
CGRectMake
(
0
,
20
,
self
.
view
.
bounds
.
size
.
width
,
40
)];
_noLabel
= label;
_noLabel
.
textAlignment
=
NSTextAlignmentCenter
;
[
self
.
view
addSubview
:
_noLabel
];
return
_noLabel
;
页面中截面都不应该放到
V
i
ewDidLoad
里
而使放在懒加载里,
用的时候才初始化调用,
使用懒加载可以避免
控件执行的先后顺序问题。
因为用的时候就自己去找,自己去调用。所以不会出现先后顺序问题
//在getter方法中,不要再使用self.否则会重复调用getter方法,造成死循环- (UILabel *)noLabel{ if (_noLabel ==nil) { UILabel *label = [[UILabelalloc] initWithFrame:CGRectMake(0,20, self.view.boun
原因: 内存溢出。
1、当A对象里面强引用了B对象,B对象又强引用了A对象,这样两者的retainCount值一直都无法为0,于是内存始终无法释放,导致内存泄露。所谓的内存泄露就是本应该释放的对象,在其生命周期结束之后依旧存在。
2、这是2个对象之间的,相应的,这种循环还能存在于3,4……个对象之间,只要相互形成环,就会导致
死循环
的问题。
3、当然也存在自...
函数调用栈,
函数调用的时候,sp 栈顶指针寄存器减对应的内存空间,栈内存开启对应的内存空间,函数调用完毕之后,sp 再加回去,栈内存释放对应的内存空间。
所以,如果是这样方式调用的话,
第一函数不会返回,栈内存不会释放。
第二是,一...
懒加载
,又称延时加载,既当对象需要用到的时候去加载,
iOS
中可以利用重写对象的get方法,当开发者调用到get方法的时候,再去加载对象。
1、不需要一开始就实例化,简化代码
2、解耦,都在各自的get方法中实现
3、减少内存,用到才会加载
@interface LazyViewController ()
@property (nonatomic, strong) UIV
一. RunLoop简介
RunLoop字面意思是跑圈,在我们的项目中其实就是运行循环,而且是充满灵性的
死循环
,为什么说他充满灵性呢?因为他可以在我们需要的时候自己跑起来运行,在我们没有操作的时候就停下来休息。充分节省CPU资源,提高程序性能。
二. RunLoop基本作用:
保持程序持续运行,程序一启动就会开一个主线程,主线程一开起来就会跑一个主线程对应的RunLoop,RunLoop
懒加载
又称为延迟加载,它是指系统不会在初始化时就加载某个对象,而是在第一次调用(使用get方法)时才加载这个对象到内存中。简单来说,就是某个对象被使用的时候再加载。
懒加载
的实现方式:重写对象的get方法,并将该对象在初始化时需要实现的代码在get方法中实现。
@interface ViewController ()
@property (nonatomic, stro...
一般我们手码封装组件时 会在initWithFrame中添加自定义操作 但是重写UITableViewCell时 却不执行这个方法 需要重写initWithStyle方法
UICollectionViewCell 这样是可以的
@implementation iComeImageCollectionViewCell
#pragma mark - System
- (insta...
对于这个问题,我可以回答。
iOS
懒加载
可以通过重写getter方法来实现,当第一次访问属性时,才会执行getter方法中的代码,从而实现
懒加载
。例如:
- (NSString *)name {
if (!_name) {
_name = [[NSString alloc] init];
return _name;
在这个例子中,当第一次访问name属性时,会执行if语句中的代码,创建一个NSString对象并赋值给_name,然后返回_name。之后再次访问name属性时,就不会再执行if语句中的代码了,直接返回_name。