UI控件和代理为什么使用weak

[email protected]属性的用法

* weak(assign) : 代理\UI控件

* strong(retain) : 其他对象(除代理\UI控件\字符串以外的对象)

* copy : 字符串

* assign : 非对象类型(基本数据类型int\float\BOOL\枚举\结构体)

2、UI控件为什么使用weak

(1)UI控件即可以使用weak,也可以使用strong,但是没有必要使用strong;(注:UIWindow 常用strong,因为它没有下面view的特点)

(2)retain 是iOS5之前的,相当于strong,都是强指针;assign相当于weak,都是弱指针;

(3)如下图所示:ViewController内有一个自带的view属性,指向内存中的view对象,同时在ViewController内自定义一个btn属性;

view对象内部有一个subviews属性,指向内存中的一个数组,该数组内存放的是一些索引,索引内存放的地址,对应的是添加到subviews内的对象,由图可见,btn是weak还是strong,对Button对象没有影响,即没有btn属性,Button对象也能存在,因为只要控制器在,控制器内的view就在,view在,view内的subviews属性就在,subviews属性在,其对应的索引数组就在,索引数组在,那么Button对象肯定存在;所以可以得到一个结论:只要控制器在,控制器view内部的子控件就都在;所以一般对 UI控件使用weak,因为弱指针相对于强指针有一些好处,比如,weak指针在没用时,会自动清空,空指针不会有内存泄漏;

3、代理为什么使用weak?

以UITableViewController为例,该控制器内部有一个tableView属性,该属性指向一个UITableView对象,UITableView 内又有两个属性:delegate和dataSource,都是assign,即弱指针,以delegate为例,而且一般UITableView的代理就是UITableViewController控制器;

如下图,若两条线都是强指针,会引发循环引用的问题,造成内存泄漏;

所以,一般代理都使用weak,即如下图,一强一弱,不会引发循环引用的问题,当然也不会造成内存泄漏;

结论:一般,控件的代理都是控制器,而控制器又拥有着该控件,所以,为了不引发循环引用的问题,代理一般都使用weak;

时间: 2024-10-14 01:12:55

UI控件和代理为什么使用weak的相关文章

iOS UI控件7(UITableView)

1.表格(UITableView)与表格控制器(UITableViewController) UITableView是iOS开发中常见的UI控件,本质是一个列表(单列的表格).UITableView允许自由控制行的控件,包括在表格行中添加多个字控件.UITableView继承了UIScrollView,具有UIScrollView的功能,这个UIScrollView主要封装了UITableViewCell单元格控件,因此UITableView默认可以对单元格进行滚动.默认情况下,所有UITabl

IOS开发UI篇--常用UI控件的基本使用

一. UIButton概述: UIKit框架提供了非常多的UI控件,其中有些控件天天使用,比如UIButton.UILabel.UIImageView.UITableView等. UIButton,俗称“按钮”,通常点击某个控件后,会做出相应反应的都是按钮.按钮的功能较多,既能显示图片又能显示汉字还能随时调整图片的文字和位置,如下面两个图 团购和音乐播放器的app: 下面本文通过一个实例总结一下它们的基本使用. 二. 按钮的基本设置 按钮既可以通过mainstoryboard创建也可以通过代码创

创建自注册的Swift UI 控件

原文链接 : Swift Programming 101: Creating Self-Registering Swift UI Controls 原文作者 : Kevin McNeish 译文出自 : 开发技术前线 www.devtf.cn 译者 : kmyhy 校对者:LastDay 状态:完成 对于自定义控件来说,在不破坏原有的消息机制的前提下,如何响应事件通知?在本文中,我将演示一个通知代理类,通过一个简单的例子,我们用该类向已有的iOS UI控件中增加了自己的新功能:为Text Vie

UI控件懒加载问题01

UI 控件懒加载问题: 1, 什么时候使用懒加载加载UI控件? 2, 加载控件的什么属性? 3, 用什么类型的指针修饰控件? code : (ARC) 定义属性, @property(nonatomic,weak) UIButton *customBtn1;   重写getter方法 -(UIButton *)customBtn1{ if (_customBtn1 == nil) { _customBtn1 = [UIButton buttonWithType:UIButtonTypeCusto

跨线程访问UI控件时的Lambda表达式

工作中经常会用到跨线程访问UI控件的情况,由于.net本身机制,是不允许在非UI线程访问UI控件的,实际上跨线程访问UI控件还是 将访问UI的操作交给UI线程来处理的, 利用Control.Invoke方法,将操作传递给UI线程,不推荐使用CheckForIllegalCrossThreadCalls = false; Control.Invoke的签名 // // 摘要: // 在拥有此控件的基础窗口句柄的线程上执行指定的委托. // // 参数: // method: // 包含要在控件的线

android_常用UI控件_01_TextView3_点击打开新的activity

点击textview打开新的activity (1) MainActivity.java package com.example.android_textview_opennewactivity; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.text.SpannableString; import android.text.Spanned;

android_常用UI控件_01_TextView4_rollingsubtitles效果加链接文字

(1)Mainactivity.java package com.example.android_textview_rollingsubtitles; import java.sql.Wrapper; import android.os.Bundle; import android.app.Activity; import android.text.Html; import android.text.TextUtils; import android.text.TextUtils.Truncat

C# WPF 使用委托修改UI控件

近段时间在自学WPF,是一个完全不懂WPF的菜鸟,对于在线程中修改UI控件使用委托做一个记录,给自已以后查询也给需要的参考: 界面只放一个RichTextBox,在窗体启动时开起两个线程,调用两个函数,每隔1秒写一次当前时间 一 界面XAML如下: <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&qu

UI控件

在iOSAPP中,能在屏幕上显示的按钮.文本标签.文字输入框等等,都是UI控件. UIview: 苹果把所有UI控件的共同属性抽出来放在UIView中,即所有UI控件都是UIView的子类(不一定是直接子类). 注意:UIView继承自UIresponder,可以响应用户的操作. UIView的重要属性 frame:View的位置和宽高 bounce:相对于自己的左上角的位置和宽高 center:中心点的坐标 backgroundcolor:背景颜色 UIView的常用方法:UIView既可以显