iOS开发基础6-懒加载、Plist 文件操作、字典转模型、自定义 View 详解
1.iOS开发基础1-第一个iOS程序2.iOS开发基础2-基础控件
3.iOS开发基础6-懒加载、Plist 文件操作、字典转模型、自定义 View 详解
4.iOS开发基础5-UIButton5.iOS开发基础4-图像资源6.iOS开发基础3-UIImage7.iOS开发基础14-KVC的应用与底层逻辑8.iOS开发基础13-深入理解 UITableView(二)9.iOS开发基础12-深入理解UITableView(一)10.iOS开发基础11-屏幕适配、Autolayout及 Masonry 框架11.iOS开发基础10-UIButton内边距和图片拉伸模式12.iOS开发基础9-提示框(UIAlertController)13.iOS开发基础8-UIScrollView14.iOS开发基础7-自定义构造方法、layoutSubviews、Xib文件与自定义View15.iOS开发基础30-UITabBarController16.iOS开发基础29-触摸事件及手势识别17.iOS开发基础28-数据存储与沙盒机制18.iOS开发基础27-导航控制器入栈与出栈机制及微博个人详情页19.iOS开发基础26-空20.iOS开发基础25-ARC和MRC深入探析21.iOS开发基础24-UIPickerView、UITextField、KVC、UIDatePicker、控制器及导航控制器22.iOS开发基础23-iOS开发中的Info.plist、UIApplication及其Delegate、UIWindow详解23.iOS开发基础22-键盘通知在iOS开发中的应用24.iOS开发基础21-深入理解通知、代理、KVO和Block在iOS开发中的应用25.iOS开发基础20-UITableView的全局及局部刷新、左滑操作与批量删除26.iOS开发基础19-深入理解和实现不等高的 UITableViewCell27.iOS开发基础18-深入理解 Objective-C Runtime 机制28.iOS开发基础16-使用 `NSTimer` 时避免内存泄露的技巧和最佳实践29.iOS开发基础15-KVO的应用与底层逻辑30.iOS开发基础65-iPad 开发指南31.iOS开发基础64-二维码32.iOS开发基础63-AVFoundation/MediaPlayer33.iOS开发基础62-音频播放34.iOS开发基础61-通讯录35.iOS开发基础60-传感器36.iOS开发基础59-内存优化37.iOS开发基础58-支付宝集成指南38.iOS开发基础57-换肤功能与静态库开发指南39.iOS开发基础56-UIDynamic物理引擎40.iOS开发基础55-利用 UIWindow 实现快速滚动到界面顶部41.iOS开发基础54-CoreLocation42.iOS开发基础53-MapKit 框架43.iOS开发基础47-iOS键盘44.iOS开发基础46-数据安全与HTTPS保护详解45.iOS开发基础45-UIWebview46.iOS开发基础44-网络编程之NSURLSession&AFN47.iOS开发基础43-CocoaPods48.iOS开发基础42-网络编程之文件下载与处理49.iOS开发基础41-网络编程之JSON和XML50.iOS开发基础40-网络编程之NSURLConnection51.iOS开发基础39-RunLoop52.iOS开发基础38-多线程之多图片下载及缓存处理53.iOS开发基础37-多线程之NSOperation54.iOS开发基础36-多线程之GCD55.iOS开发基础35-多线程之NSThread56.iOS开发基础34-多线程57.iOS开发基础33-核心动画(二)58.iOS开发基础33-核心动画(一)59.iOS开发基础32-Quartz2D(二)60.iOS开发基础32-Quartz2D(一)61.iOS开发基础31-Modal 与 Push 详解62.iOS开发基础76-iOS 开发中的属性修饰符详解63.iOS开发基础75-iOS开发中的Block深度解析64.iOS开发基础74-Swift他来了65.iOS开发基础73-24种性能优化技巧66.iOS开发基础72-Xcode 7 升级后的问题与解决方案详解67.iOS开发基础71-应用中的 StatusBar 详解68.iOS开发基础70-TCP与UDP69.iOS开发基础69-应用开发中的 Controller 间通信模式70.iOS开发基础68-图片轮播71.iOS开发基础67-流水布局相册缩放72.iOS开发基础66-UISearchBar 控件指南73.iOS开发基础78-iOS 国际化在 iOS 开发中,有诸多高效的开发技巧与模式可以大大提高代码的可读性与可维护性。本文将详细介绍以下几个重要的知识点:懒加载(Lazy Loading)、Plist 文件操作、字典转模型(Dictionary to Model)、以及自定义 View,并对其底层逻辑进行分析。
一、懒加载(Lazy Loading)
懒加载是一种延迟加载的策略,只有在第一次使用到数据时,才会实际创建并初始化该数据。这不仅能够节省内存,还能提升应用性能。来看一下懒加载的具体实现:
懒加载示例代码
@property (nonatomic, strong) NSArray *shops;
- (void)viewDidLoad {
[super viewDidLoad];
if (self.shops == nil) {
NSLog(@"创建商品数组");
self.shops = @[
@{@"name": @"单肩包", @"icon": @"danjianbao"},
@{@"name": @"链条包", @"icon": @"liantiaobao"},
@{@"name": @"钱包", @"icon": @"qianbao"},
@{@"name": @"手提包", @"icon": @"shoutibao"}
];
}
}
底层逻辑分析
懒加载的核心思想是惰性初始化,只有在实际需要创建对象时(如访问属性或调用方法时)才进行初始化操作。这避免了在程序启动时就初始化所有对象,从而减少启动时间与内存占用。
在 viewDidLoad
方法中,判断 shops
属性是否为 nil
,如果是 nil
则创建并初始化它。这保证了 shops
数组只会被创建一次。
二、Plist 文件操作
在 iOS 开发中,Plist 文件是一种常用的轻量级数据存储方式。Plist 是 Property List 的缩写,主要用于存储键值对数据。
向 Plist 文件写入数据
[_shops writeToFile:@"/Users/用户名/Desktop/shops.plist" atomically:YES];
从 Plist 文件读取数据
NSString *path = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];
_shops = [NSArray arrayWithContentsOfFile:path];
注意事项
- 自定义 Plist 文件命名:不要命名为
info.plist
或包含info
单词,因为info.plist
是系统保留文件,用于存储应用的配置信息。 - 路径管理:路径应该动态获取,避免硬编码路径,适应不同环境的文件系统。
三、字典转模型(Dictionary to Model)
在实际开发中,经常需要从服务器获取数据并转换为模型对象。直接从字典中获取数据有以下缺点:
- 字符串字典键:错误拼写不会报错。
- 无智能提示:编码时没有键提示,容易出错。
- 维护困难:随着业务逻辑复杂度增加,直接操作字典会增加代码的复杂度和维护难度。
字典转模型示例代码
@interface NJShop : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *icon;
+ (instancetype)shopWithDict:(NSDictionary *)dict;
@end
@implementation NJShop
+ (instancetype)shopWithDict:(NSDictionary *)dict {
NJShop *shop = [[self alloc] init];
shop.name = dict[@"name"];
shop.icon = dict[@"icon"];
return shop;
}
@end
// ViewController 中的使用
@interface ViewController ()
@property (nonatomic, strong) NSMutableArray *shops;
@end
- (NSMutableArray *)shops {
if (_shops == nil) {
NSString *path = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];
NSArray *tempArr = [NSArray arrayWithContentsOfFile:path];
_shops = [NSMutableArray array];
for (NSDictionary *dict in tempArr) {
NJShop *shop = [NJShop shopWithDict:dict];
[_shops addObject:shop];
}
}
return _shops;
}
简化模型初始化
通过为模型类添加初始化方法,直接将字典数据映射到模型属性中。这样不仅减少了直接操作字典的繁琐代码,还保障了数据的一致性和类型安全。
四、自定义 View
自定义 View 可以更好地封装和复用视图逻辑,提高代码的模块化程度。
自定义 View 示例代码
@interface NJShopView : UIView
@property (nonatomic, strong) NJShop *shop;
@end
@implementation NJShopView {
UIImageView *_iv;
UILabel *_label;
}
- (instancetype)init {
if (self = [super init]) {
[self setupSubviews];
}
return self;
}
- (void)setupSubviews {
UIImageView *iv = [[UIImageView alloc] init];
[self addSubview:iv];
_iv = iv;
UILabel *label = [[UILabel alloc] init];
label.textAlignment = NSTextAlignmentCenter;
[self addSubview:label];
_label = label;
}
- (void)layoutSubviews {
[super layoutSubviews];
CGFloat shopViewWidth = self.frame.size.width;
CGFloat shopViewHeight = self.frame.size.height;
_iv.frame = CGRectMake(0, 0, shopViewWidth, shopViewWidth);
_label.frame = CGRectMake(0, shopViewWidth, shopViewWidth, shopViewHeight - _iv.frame.size.height);
}
- (void)setShop:(NJShop *)shop {
_shop = shop;
_iv.image = [UIImage imageNamed:_shop.icon];
_label.text = _shop.name;
}
@end
自定义 View 的最佳实践
- 弱引用子视图:在自定义视图中使用
weak
来引用子视图,避免潜在的内存泄漏。 init
方法中设置子视图:避免在初始化方法中设置子视图的 frame,因为此时父视图的 frame 可能不确定。- 重写
layoutSubviews
方法:子视图的布局逻辑应放在layoutSubviews
方法中,该方法会在子视图加入父视图后并进行尺寸调整时调用。
底层逻辑分析
- 生命周期管理:
layoutSubviews
方法控制子视图布局,保证其在父视图尺寸确定后进行适当的调整。 - 内存管理:通过
weak
引用防止内存泄漏,同时保证子视图被父视图强引用。
五、总结
通过上述内容,我们详细介绍了懒加载、Plist 文件操作、字典转模型、自定义 View 的实现与最佳实践,并分析了其底层原理。在实际开发中,熟悉并掌握这些知识点,可以显著提升代码质量和开发效率。
- 懒加载:提高内存使用效率,避免不必要的初始化。
- Plist 文件操作:轻量级数据存储,操作简便。
- 字典转模型:解决直接操作字典的种种弊端,提升代码可维护性。
- 自定义 View:高度封装和复用视图逻辑,提高代码模块化程度。
将来的你会感谢今天如此努力的你!
版权声明:本文为博主原创文章,未经博主允许不得转载。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!