有人问。在ARC下,IBOutlets究竟应该定义成strong 还是 weak ?支持这个答案的人最多。答案仅是摘自官方文档的一个片段:

From a practical perspective, in iOS and OS X outlets should be defined as declared properties. Outlets should generally be weak, except for
those from File’s Owner to top-level objects in a nib file (or, in iOS, a storyboard scene) which should be strong. Outlets that you create will therefore typically be weak by default, because:

  • Outlets that you create to, for example, subviews of a view controller’s view or a window controller’s window, are arbitrary references between objects that do
    not imply ownership.

  • The strong outlets are frequently specified by framework classes (for example, UIViewController’s view outlet, or NSWindowController’s window outlet).

  • 大意是说。在 ARC 中,一般outlet属性都推荐使用 weak,应该使用
    strong 的 outlet 是 File's
    Owner连接到 nib 的顶层对象。

什么是 File's Owner连接到 nib 的顶层对象呢?说白话一点。就是自己定义的view,不是直接作为main view里面一个sub view直接显示出来。而是须要通过实例化创建出来的。

你自己实例化。当然须要strong了,不然谁还替你保留对象全部权呢?

以上的分析都没有错,可是总认为少了点什么。

对于究竟是weak 还是 strong,归根结底,还是要刨到对对象全部权的问题上,可是不便于总结出浅显易懂的规律性使使用方法则。于是。就会有一个又一个的特例打破文档所总结的常规,不明确规则的根是什么,还是会碰到麻烦的。

我来举一个简单的样例,创建一个程序入口指向navigation controller的project,导航栏上拖2个button:

右側button用于控制相机button的显示与否。依照文档的指示。我们在程序中定义这两个button应为weak属性

#import   

@interface TestViewController : UIViewController
{
BOOL isShowing;
}
@property (nonatomic,weak)IBOutlet UIBarButtonItem *controlBtn;
@property (nonatomic,weak)IBOutlet UIBarButtonItem *cameraBtn;
-(IBAction)controlAction:(id)sender;
@end

用右側button,控制相机button的隐藏和显示:

#import "TestViewController.h"
@interface TestViewController ()
@end @implementation TestViewController
@synthesize cameraBtn,controlBtn; - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
isShowing = YES;
} -(IBAction)controlAction:(id)sender
{
if (isShowing) {
self.controlBtn.title = @"显示相机";
self.navigationItem.leftBarButtonItem = nil;
isShowing = NO;
}else {
self.controlBtn.title = @"隐藏相机";
self.navigationItem.leftBarButtonItem = cameraBtn;
isShowing = YES;
}
}
@end

实验结果是。第一次隐藏了相机button后,就再也显示不出来了。原因非常easy,cameraBtn指向了空。我们丢失了cameraBtn的对象全部权。

解决这个问题的办法有两个:

1.不在xib或者storyboard上拖相机button,而是用代码创建,自己控制对象全部权

2.将 cameraBtn 定义为strong

我想强调的当然是另外一种方法

顺便提一下ARC其它属性的规则:

  • strong:等同于"retain",属性成为对象的拥有者

  • weak:属性是 weak pointer,当对象释放时会自己主动设置为 nil

  • unsafe_unretained:等同于之前的"assign",仅仅有 iOS 4 才应该使用

  • copy:和之前的 copy 一样,复制一个对象并创建 strong 关联

  • assign:对象不能使用 assign,但原始类型(BOOL、int、float)仍然能够使用

【iOS开发系列】XIB IBOutlets use strong or weak ?的更多相关文章

  1. ios开发ARC,IBOutlets之strong与weak

    今天在写程序的时候,用IBOutlets连了一个自定义的控件,出现了问题,后面访问的时候,控件里有些subviews没有初始化好,取到的时候为nil, 程序里用了ARC, IBOutlets一连接上, ...

  2. iOS开发系列--Swift进阶

    概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...

  3. iOS开发系列--数据存取

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

  4. iOS开发系列--网络开发

    概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...

  5. iOS开发系列--并行开发其实很容易

    --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...

  6. 【转】iOS开发系列--数据存取

    原文: http://www.cnblogs.com/kenshincui/p/4077833.html#SQLite 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储 ...

  7. iOS开发系列--Swift语言

    概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...

  8. iOS开发系列文章(持续更新……)

    iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...

  9. iOS开发系列--App扩展开发

    概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...

随机推荐

  1. 南海区行政审批管理系统接口规范v0.3(规划) 2.业务申报API 2.1.businessApply【业务申报】

    {"v_interface":"2015987654327","c_project":"NH09A102"," ...

  2. OC数组和字典中存入niu值

    在NSArray和NSDictionary中nil有特殊的含义.但是某些时候,我们必须要放入nil怎么办? 要想放入nil就必须用到一个类NSNull,这个类只有一个类方法,就是null.[NSNul ...

  3. mysqls,为node.js而编写的sql语句生成插件 (crud for mysql).

    It is written in JavaScript,crud for mysql.You can also use transactions very easily. mysqls 一款专为nod ...

  4. uirecorder录制脚本

    安装步骤不再描述. 将手机通过数据线连接到mac 然后输入启动macaca的命令: macaca server --port 4444 --verbose & 在输入 命令:uirecorde ...

  5. Android应用优化之代码检测优化

    在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...

  6. vue 子组件向父组件传值通信

    父组件 子组件 子组件用this.$emit

  7. ES5:深入解析如何js定义类或对象。

    1.原始方式 var oCar = new  Object; oCar.color = "blue"; oCar.showColor = function(){alert(this ...

  8. [Intermediate Algorithm] - Sum All Odd Fibonacci Numbers

    题目 给一个正整数num,返回小于或等于num的斐波纳契奇数之和. 斐波纳契数列中的前几个数字是 1.1.2.3.5 和 8,随后的每一个数字都是前两个数字之和. 例如,sumFibs(4)应该返回 ...

  9. 给html里面的class添加一个判断语句,判断当前class是否显示(vue)

    当我们想判断这个class是否出现时,其实有很多方法, 我这个是做了一个选项卡,当点击的时候navTitle的值和循环的item的值相同时class就等于borderbottom, 这样我们点击的图层 ...

  10. print输出带颜色的方法详解

    书写格式:     开头部分:\033[显示方式;前景色;背景色m + 结尾部分:\033[0m      注意:开头部分的三个参数:显示方式,前景色,背景色是可选参数,可以只写其中的某一个:另外由于 ...