一、懒加载

1.懒加载定义

懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小)。所谓懒加载,写的是其get方法.

注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化

2.使用懒加载的好处:

(1)不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强

(2)每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合

3.代码示例

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong)UIImageView *imageView;//QQ图片

@property (nonatomic, strong)UILabel *userNameLabel;//用户名

@property (nonatomic, strong)UITextField *userNameTextField;//用户名输入框

@property (nonatomic, strong)UILabel *passwordLabel;//密码

@property (nonatomic, strong)UITextField *passwordTextField;//密码输入框

@end
@implementation ViewController

/** 懒加载

*  懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小)。所谓懒加载,写的是其get方法;

*  图片控件的延迟加载

*/

- (UIImageView *)imageView {

//判断对象是否已经有了,如果没有,则进行实例化创建对象

if (_imageView == nil) {

self.imageView = [[UIImageView alloc]initWithFrame:CGRectMake(, , self.view.frame.size.width - , )];

//添加图片

_imageView.image = [UIImage imageNamed:@"QQ.jpg"];

}

return _imageView;//返回图片控件对象

}

/**

*  懒加载

*  用户名标签控件的延迟加载

*/

- (UILabel *)userNameLabel {

//判断对象是否已经有了,如果没有,则进行实例化创建对象

if (_userNameLabel == nil) {

self.userNameLabel = [[UILabel alloc]initWithFrame:CGRectMake(, , , )];

_userNameLabel.adjustsFontSizeToFitWidth = YES;

_userNameLabel.text = @"用户名";

}

return _userNameLabel;

}

/**

*  懒加载

*  用户名输入框的延迟加载

*/

- (UITextField *)userNameTextField {

//判断对象是否已经存在,如果不存在,则进行实例化创建对象

if (_userNameTextField == nil) {

self.userNameTextField = [[UITextField alloc]initWithFrame:CGRectMake(, , self.view.frame.size.width - , )];

_userNameTextField.placeholder = @"请输入用户名:";

_userNameTextField.borderStyle = UITextBorderStyleRoundedRect;

}

return _userNameTextField;

}

/**

*  懒加载

*  密码标签的懒加载

*/

- (UILabel *)passwordLabel {

//判断对象是否已经存在,如果不存在,则进行实例化创建对象

if (_passwordLabel == nil) {

self.passwordLabel = [[UILabel alloc]initWithFrame:CGRectMake(, , , )];

_passwordLabel.text = @"密码";

_passwordLabel.adjustsFontSizeToFitWidth = YES;

}

return _passwordLabel;

}

/**

*  懒加载

*  密码输入框的懒加载

*/

- (UITextField *)passwordTextField {

//判断对象是否已经存在,如果不存在,则进行实例化创建对象

if (_passwordTextField == nil) {

self.passwordTextField = [[UITextField alloc]initWithFrame:CGRectMake(, , self.view.frame.size.width - , )];

_passwordTextField.borderStyle = UITextBorderStyleRoundedRect;

_passwordTextField.placeholder = @"请输入密码:";

}

return _passwordTextField;

}

- (void)viewDidLoad {

[super viewDidLoad];

//将图片控件添加到视图控制器的根视图view上;

[self.view addSubview:self.imageView];

//将用户名控件添加到视图控制器的根视图view上

[self.view addSubview:self.userNameLabel];

//将用户名输入框控件添加到视图控制器的根视图view上

[self.view addSubview:self.userNameTextField];

//将密码控件添加到视图控制器的根视图view上

[self.view addSubview:self.passwordLabel];

//将密码输入框对象添加到视图控制器的根视图view上

[self.view addSubview:self.passwordTextField];

// Do any additional setup after loading the view, typically from a nib.

}

二、重写setter方法赋值

在UITableView中为cell上的控件赋值,可以在自定义的cell接口部分声明一个方法,然后在实现部分为cell上的控件赋值即可,不过,如果在接口部分写一个属性,然后,在对应的实现部分重写setter方法为cell上的控件赋值,这样在外界访问时就更加方便了;

代码实例如下:

@interface Person : NSObject

@property (nonatomic, strong)NSString *name;//姓名

@property (nonatomic, strong)NSString *phoneNumber;//电话号码

//自定义初始化方法

- (id)initWithName:(NSString *)name

phoneNumber:(NSString *)phoneNumber;

@end

#import "Person.h"

@implementation Person

- (id)initWithName:(NSString *)name phoneNumber:(NSString *)phoneNumber {

self = [super init];

if (self) {

self.name = name;

self.phoneNumber = phoneNumber;

}

return self;

}

#import#import "Person.h"

/*

定制cell

*/

@interface CustomCell : UITableViewCell

@property (nonatomic, strong)UILabel *nameLabel;//姓名

@property (nonatomic, strong)UILabel *phoneNumberLabel;//电话

@property (nonatomic, strong)Person *model;//属性,为cell上的控件赋值

@end

#import "CustomCell.h"

@implementation CustomCell

//重写初始化方法

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{

self  = [super initWithStyle:style reuseIdentifier:

reuseIdentifier];

if (self) {

//1.添加联系人姓名

self.nameLabel = [[UILabel alloc]initWithFrame:CGRectMake(, , , )];

self.nameLabel.textAlignment = NSTextAlignmentLeft;

self.nameLabel.adjustsFontSizeToFitWidth = YES;

self.nameLabel.textColor = [UIColor blackColor];

[self.contentView addSubview:self.nameLabel];

//2.添加电话号码

self.phoneNumberLabel = [[UILabel alloc]initWithFrame:CGRectMake(, , , )];

self.phoneNumberLabel.textAlignment = NSTextAlignmentLeft;

self.phoneNumberLabel.adjustsFontSizeToFitWidth = YES;

[self.contentView addSubview:self.phoneNumberLabel];

}

return self;

}

//重新setter方法,为cell上的控件赋值

- (void)setModel:(Person *)model {

if (_model != model) {

_model = model;

}

//为nameLabel赋值

self.nameLabel.text = model.name;

//为phoneNumberLabel赋值

self.phoneNumberLabel.text = model.phoneNumber;

}

@end

//在配置cell的方法里,调用setter方法,为cell的控件赋值;

//配置cell  设置cell上显示的内容,同时返回cell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

//使用自定义cell

//1.创建静态标示符字符串

static NSString *cellIdentifier = @"CELL";

//2.根据重用标示符去重用队列里找对应类型的cell使用,(获取可重用的cell)

CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

//3.判断是否从重用队列中获取到可重用的cell,如果没有获取到,则需要重新创建相对应类型的cell对象

if (cell == nil) {

cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

}

//让cell上的控件显示数据,为cell赋值

cell.model = [self.personArray objectAtIndex:indexPath.row];

return cell;

}

两种懒加载方法区别:第一种点语法,会死循环. 懒加载要用第二种方法. 点语法就是调用set和get方法, 还没初始化实例,又在get里面调用setget,是不行地!

self.imageView = [[UIImageView alloc]initWithFrame:CGRectMake(130, 80, self.view.frame.size.width - 260, 155)];(不会递归)
_imageView = [[UIImageView alloc]initWithFrame:CGRectMake(130, 80, self.view.frame.size.width - 260, 155)];

一个声明好的属性可以同时实现set和get方法吗?我试了,两个同时实现会报错!注释掉其中一个就不报错了!这是为什么?

同时重写需要自己声明@synthesize <#property#>,不然系统不会再自动关联<#property#>和 _<#property#>.

 

iOS开发UI篇-懒加载、重写setter方法赋值的更多相关文章

  1. iOS开发UI篇—懒加载

    iOS开发UI篇—懒加载 1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...

  2. iOS开发UI中懒加载的使用方法

    1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其getter方法.说的通俗一点,就是在开发中,当程序中需要利用的资源时.在程序启动的时候不加载 ...

  3. iOS开发——UI基础-懒加载,plist文件,字典转模型,自定义view

    一.懒加载 只有使用到了商品数组才会创建数组 保证数组只会被创建一次 只要能够保证数组在使用时才创建, 并且只会创建一次, 那么我们就称之为懒加载 lazy - (void)viewDidLoad 控 ...

  4. iOS开发UI篇—懒载入

    iOS开发UI篇-懒载入 1.懒载入基本 懒载入--也称为延迟载入,即在须要的时候才载入(效率低,占用内存小).所谓懒载入,写的是其get方法. 注意:假设是懒载入的话则一定要注意先推断是否已经有了. ...

  5. UI篇—懒加载

    1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化 ...

  6. ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

    本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布 ...

  7. iOS开发UI篇—UITableview控件使用小结

    iOS开发UI篇—UITableview控件使用小结 一.UITableview的使用步骤 UITableview的使用就只有简单的三个步骤: 1.告诉一共有多少组数据 方法:- (NSInteger ...

  8. iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一)

    iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一) 一.项目结构和plist文件 二.实现代码 1.说明: 主控制器直接继承UITableViewController // ...

  9. iOS开发UI篇—使用picker View控件完成一个简单的选餐应用

    iOS开发UI篇—使用picker View控件完成一个简单的选餐应用 一.实现效果 说明:点击随机按钮,能够自动选取,下方数据自动刷新. 二.实现思路 1.picker view的有默认高度为162 ...

随机推荐

  1. JSP执行过程

    JSP执行流程: @1.客户端发出请求. @2.Web容器将JSP转译成Servlet源代码. @3.Web容器将产生的源代码进行编译. @4.Web容器加载编译后的代码并执行. @5.把执行结果响应 ...

  2. PHP通过链接获取二进制数据的方法

    function urltoblob($url){ $data = @file_get_contents($url); //如果file得不到数据,则给空值 if(!$data){ $data = & ...

  3. 项目知识点.Part3

    内存管理: 基本数据类型或者Core Foundation对象都没有引用计数 主线程会自动创建释放池,子线程需要手动创建释放池. 具体的区别:http://www.cnblogs.com/langti ...

  4. 项目知识点.Part1

    1. storyboard中添加scrollview: 先添加scrollView,进行约束 添加View 进行约束 相对于scrollView 如果水平滑动:设置vertically in Cont ...

  5. linux直接启动到字符界面或从字符界面启动到图形化界面

    修改/etc/inittab文件 将内容为:"id:5:initdefault"的行的数字5改为3,保存重启即可直接进入字符界面 PS:3和5分别表示运行级别 从字符界面启动到图形 ...

  6. GNU INET SOCKET

    Linux程序设计入门 - socket/inetd programming UNIX Socket Programming基本上是一本书名.Socket programming其实需要相 当程度的基 ...

  7. BZOJ 3786 星系探索

    Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...

  8. vsphere 出现“在主机的当前连接状况下不允许执行该操作”

    问题: 登录vsphere client启动虚拟机出现“在主机的当前连接状况下不允许执行该操作” 解决方法: 1.选择主机->右键->断开 2.选择主机->右键->连接 3.在 ...

  9. STM32F10x 学习笔记6(USART实现串口通讯 2)

    这次讲讲利用串口收发中断来进行串口通讯.STM32 上为每个串口分配了一个中断.也就是说无论是发送完成还是收到数据或是数据溢出都产生同一个中断.程序需在中断处理函数中读取状态寄存器(USART_SR) ...

  10. VC版本的MakeObjectInstance把WNDPROC映射到类的成员函数

    这段时间用VC封装Windows类库,没有MakeObjectInstance处理窗口消息确实不爽,又不想使用MFC的消息映射,这玩意的效率和美观只能呵呵. 至于MakeObjectInstance是 ...