IOS 开发笔记-基础 UI(8)控件连线的 strong 和 weak 设定

回忆 oc 的内存管理:

objective-c 语法快速过(6)内存管理原理objective-c 语法快速过(7)编译器特性ARC

ARC是苹果为了简化程序员对内存的管理,推出的一套内存管理机制,使用ARC机制,对象的申请和释放工作会在运行时,由编译器自动在代码中添加retain和release

1> strong:强指针引用的对象,在生命周期内不会被系统释放,在OC中,对象默认都是强指针

2> weak:弱指针引用的对象,系统会立即释放,弱指针可以指向其他已经被强指针引用的对象

他们都是 arc 的东西

ARC的判断准则:

只要没有强指针指向对象,就会释放对象,弱指针不会这样,及时有弱指针指向对象,对象没有强指针指向,也会自动释放掉。一般,无需显式声明为强指针,但是在封装里,定义方法的时候需要写明。而弱指针,必须显式说明。默认是强指针。

ARC特点

1> 不允许调用release、retain、retainCount

2> 允许重写dealloc,但是不允许调用[super dealloc]

3> @property的参数

* strong :成员变量是强指针(适用于OC对象类型)

* weak :成员变量是弱指针(适用于OC对象类型)

* assign : 适用于非OC对象类型

4> 以前的retain改为用strong

oc的指针分2种:

1> 强指针:默认情况下,所有的指针都是强指针 __strong

2> 弱指针:__weak

在 点m 文件

#import "Dashuai.h"

@implementation Dashuai
- (void)dealloc
{
    NSLog(@"对象被销毁了!");
    //[super dealloc];
}
@end

在视图控制器

@interface ViewController ()
@property (nonatomic, strong) Dashuai  *da;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.da = [[Dashuai alloc] init];
    NSLog(@"调用了 viewdidlowd 方法!");
}
@end

对象不销毁,da 是强指针对象。

如果是在方法内部,声明的对象(默认都是强指针),那么存在一个声明周期(局部变量)的问题。方法执行完毕,到关括号完毕,内存也就随机自动销毁了。

- (void)viewDidLoad {
    [super viewDidLoad];
    //self.da = [[Dashuai alloc] init];
    Dashuai *dashuai = [[Dashuai alloc] init];
    NSLog(@"调用了 viewdidlowd 方法!");
}

2015-03-08 17:12:33.240 strong weak[20017:738240] 调用了 viewdidlowd 方法!

2015-03-08 17:12:33.241 strong weak[20017:738240] 对象被销毁了!

如果换__weak,那么语句执行完毕,立即释放内存,加断点课证明

2015-03-08 17:15:41.480 strong weak[20062:739972] 对象被销毁了!

(lldb) 

下面看堆栈图

上例,强指针的话,那么指针变量dashuai在内存的栈区,仅仅是内存的地址,指向的内存在堆区,

等指针不再指向这块内存,或者声明周期结束,内存才释放

对于弱指针指向,是虚线

执行之后,对象内存立即被释放。

再看控件之间,如图:

视图控制器强引用 view,view 强引用了子控件。

[self.view addSubView];//让 view 对控件强引用

那么这就是以前写代码的时候,连线故事板的控件和代码关联的时候,总是默认weak的原因。因为那是视图控制器在引用子控件,而 view 已经 strong 了,那么视图控制器就没必要 strong。它的内存释放过程是:

     

如果程序没有必要弄强引用,那么就用若引用,类比是链表,一条龙,视图和姿势图,只一个实线连接(父类对象,强引用子类对象之后),其余的引用用 weak虚线,因为view 已经对子控件强引用了,视图控制器可以不用 strong。这是苹果的应用内存管理机制。当然用 strong 也不是不可以。

还有之前提到的懒加载

控件的懒加载,是手动的写类属性的 set 方法,进行是否已经加载等的判断,避免重复加载的过程。那么手写 set ,在 viewdidload重写代码,就要用 strong 引用,因为是手写代码,那么如果还是 weak ,在 viewdidload 方法里,使用控件对象,那么一旦执行完毕,立即内存被释放,因为是 weak 的。这样在视图加载之前,对象就已经消失了。

注意下面的方法调用时间

init方法-初始化程序viewDidLoad方法-加载视图viewWillAppear方法在,UIViewController对象的视图即将加入窗口时调用;

viewDidApper方法在UIViewController对象的视图已经加入到窗口时调用;

viewWillDisappear方法咋UIViewController对象的视图即将消失、被覆盖或是隐藏时调用;

viewDidDisappear方法在UIViewController对象的视图已经消失、被覆盖或是隐藏时调用;

didReceiveMemoryWarning -在内存不足时候调用

@property参数使用小结:

1> 控件用weak

2> 属性对象用strong

3> 非对象类型用assign

4> 字符串NSString用copy(不是可变字符串)

提示:在纯手码实现界面布局时,如果通过懒加载处理界面控件,需要使用strong强指针

时间: 2024-12-24 20:07:47

IOS 开发笔记-基础 UI(8)控件连线的 strong 和 weak 设定的相关文章

IOS 开发笔记-基础 UI(1)-简单的计算器

(1)UI是App的根基:一个App应该是先有UI界面,然后在UI的基础上增加实用功能 (2)UI相对简单易学:UI普遍是学习过程中最简单的一块,能快速拥有成就感和学习兴趣 (3)UI至关重要:开发中的绝大部分时间都在处理UI 谨记一条IOS软件开发定律:万物皆对象,UI界面上的每一个元素都是一个对象 IOS,android 软件开发过程 UIKit框架是跟UI有关系的,标签,文本,按钮,进度条,开关等控件,都是封装在UIKit框架内部的,UIKit框架中提供了丰富多彩的可视化组件元素,利用UI

IOS 开发笔记-基础 UI(2)

1.公司标示一般使用反向域名 正向域名 www.xxx.com 用来标示一台网络主机,只要公司内部不重复就可以.反向域名 com.xxx.demo 用来标示产品,应该唯一标识. cn.com.abc.product,最后面是自己公司的产品名字 2..Bundle Identifier: 产品唯一标示符 Bundle ID = 公司的反向域名 + 产品名 1> 在模拟器上面,只能有一个唯一的标示符的应用程序2> 在AppStore上,所有的应用程序的Bundler ID都是唯一的 Bundle

IOS 开发笔记-基础 UI(6)照片浏览器(控件的懒加载)

使用UIImageView.UILabel.UIButton实现一个综合小案例 功能分析 (1)点击箭头切换序号.图片.描述 (2)如果是首张图片,左边箭头不能点击 (3)如果是尾张图片,右边箭头不能点击 步骤分析 (1)搭建UI界面 (2)监听按钮点击 切换序号.图片.描述 1. 界面分析 1> 需要读取或修改的属性的控件 // 序号标签 // 图片 // 图片描述 // 左边按钮 // 右边按钮 2> 需要监听响应事件的对象,需要添加监听方法 // 左边按钮 // 右边按钮 uiimage

IOS 开发笔记-基础 UI(5)使用代码创建按钮

在实际开发中,很多的时候是需要手动写代码来创建按钮的. 在开发过程中,并不是每次都通过storyboard拖控件完成UI界面,因为storyboard上面的界面是“固定死”的,有时候可能会在程序运行过程中动态地添加一些新的控件到界面上,比如QQ,微信的聊天信息,是有人发出一条信息后才动态显示出来的.因此,需要掌握如何用代码动态地添加控件.实际上,storyboard的本质就是根据图形界面描述转成相应的代码(xml 文件).还有一个原因,就是有的国内的公司,或者一些 IOS 开发的团队,并不使用故

IOS 开发笔记-基础 UI(3)按钮的使用(放大缩小、改变位置,首位式动画)和学习案例

UIKit框架提供了非常多的UI控件,但并不是每一个都很常用,有些控件可能1年内都用不上,有些控件天天用,比如UIButton.UILabel.UIImageView.UITableView等等,按钮控件是非常重要且比较基础的一个UI控件---UIButton,一般情况下,点击某个控件后,会做出相应反应的都是按钮,按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置. 案例: 功能分析 (1)左下角4个方向按钮,控制头像按钮的位置 (2)右下角分别是放大.缩小按钮,控制

IOS 开发笔记-基础 UI(4)按钮的使用(transform属性)和学习案例

利用transform属性可以修改控件的位移(位置).缩放.旋转.经常用在动画里,比如旋转角度,动画缩放,平移等 先学几个 xcode 开发的小技巧: 故事板的viewcontroll,可以直接拖拽复制,且不同项目里的图片素材也可以相互拖拽复制使用,但是图片的拖拽复制要按option 健进行,否则就是剪切了.那么我们在开发到类似的一些项目的时候,不用每次都重写弄界面,那么可以直接拖拽拷贝故事板,图片拖拽要按住 option 键同时拽到 images.xcassets 目录下即可正常显式,且拖拽到

IOS 开发笔记-基础 UI(7)汤姆猫(UIImageView 的序列帧动画、图片加载,方法重构、Bundle 图片素材)

使用UIImageView.UIButton实现一个综合小案例---汤姆猫 回忆:UIImageView 来自UIView,UIView 来自UIResponder,UIButton 来自UIControl,UIControl 来自UIView 单独看实现,代码实现其实比较简单,但是创意很难得,美工要求很高! 是一个了不起的游戏! 功能分析 (1)点击对应的按钮后,让汤姆猫展现对应的动画 步骤分析 (1)搭建UI界面,同时也是准备素材 (2)监听按钮点击 (3)根据点击的按钮执行对应的动画 说明

IOS 开发笔记-基础 UI(9)运行循环的概念

运行循环 int i = 0; // 死循环 while (YES) { printf("请输入一个整数,0表示退出:"); scanf("%d", &i); NSLog(@"%d", i); if (i == 0) { break; } } 以上程序,会不停的循环运行,但是,会在输入的时候中断,等待,有了输入之后,再继续循环运行,且一旦输入了复合条件的值,那么通过 if 判断,break退出循环体. 这就是简单的 runloop 模型.

iOS开发项目篇—43子控件的细节处理

iOS开发项目篇—43子控件的细节处理 一.升级UI 把之前的UI图片删除,换上新的图片(图片命名一致,规范)没有其他的影响. 删除之后,添加. 替换之后,做一次clear操作. 建议把沙盒中的包删除,删除之后再做一次clear操作. 二.调整转发(模块) 1.设置背景(使用提供的素材图片进行平铺) 为转发微博部分设置背景,考虑到这个部分整体上是一个UIView,可以尝试以下设置. 第一种尝试: 但是这样设置,因为图片是平铺的,所以整个背景会出现线条效果,影响显示,不可行. 第二种尝试: 注意: