控制器属性传值的一些小问题

这篇博文并没有什么技术含量,属于很基础的知识,但也容易在感官上产生错误的认识,今天记录于此。

一个对象,无论是被转存到数组中,还是被多个控制器持有,如果这个对象没有发生值的拷贝(创建出新的对象),所有的对这个对象的持有者只持有了一个样本,修改了这个样本的值会影响到所有持有者。

效果演示图:

测试用源码:

DataModel.h 与 DataModel.m

//
//  DataModel.h
//  BaseViewController
//
//  Created by YouXianMing on 15/1/2.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <Foundation/Foundation.h>@interface DataModel : NSObject@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSNumber *age;
@property (nonatomic, strong) NSArray  *array;@end

//
//  DataModel.m
//  BaseViewController
//
//  Created by YouXianMing on 15/1/2.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "DataModel.h"@implementation DataModel@end

ChangeValueViewController.h 与 ChangeValueViewController.m

//
//  ChangeValueViewController.h
//  BaseViewController
//
//  Created by YouXianMing on 15/1/2.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "DataModel.h"@interface ChangeValueViewController : UIViewController@property (nonatomic, strong) DataModel *dataModel;@end

//
//  ChangeValueViewController.m
//  BaseViewController
//
//  Created by YouXianMing on 15/1/2.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "ChangeValueViewController.h"@interface ChangeValueViewController ()@property (nonatomic, strong) UILabel *label;@end@implementation ChangeValueViewController- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor yellowColor];self.dataModel.age        = @(self.dataModel.age.intValue + 1);self.dataModel.array      = @[@"2", @"1", @"2"];[self createButton];[self createLabel];
}#pragma mark - 创建出label
- (void)createLabel {self.label               = [[UILabel alloc] initWithFrame:self.view.bounds];self.label.text          = @"Back";self.label.font          = [UIFont fontWithName:@"HelveticaNeue-Thin" size:70.f];self.label.textAlignment = NSTextAlignmentCenter;self.label.textColor     = [UIColor grayColor];[self.view addSubview:self.label];
}#pragma mark - 创建按钮以及按钮事件
- (void)createButton {UIButton *button = [[UIButton alloc] initWithFrame:self.view.bounds];[self.view addSubview:button];[button addTarget:selfaction:@selector(buttonEvent:)forControlEvents:UIControlEventTouchUpInside];
}
- (void)buttonEvent:(UIButton *)button {[self dismissViewControllerAnimated:YES completion:^{}];
}@end

ViewController.m

//
//  ViewController.m
//  BaseViewController
//
//  Created by YouXianMing on 15/1/2.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "ChangeValueViewController.h"
#import "DataModel.h"@interface ViewController ()@property (nonatomic, strong) DataModel *dataModel; // 数据model
@property (nonatomic, strong) UILabel   *label;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// 数据modelself.dataModel       = [DataModel new];self.dataModel.name  = @"YouXianMing";self.dataModel.age   = @(27);self.dataModel.array = @[@"1"];[self createButton];[self createLabel];
}#pragma mark - 创建出label
- (void)createLabel {self.label               = [[UILabel alloc] initWithFrame:self.view.bounds];self.label.text          = [NSString stringWithFormat:@"%@ - %@", self.dataModel.name, self.dataModel.age];self.label.font          = [UIFont fontWithName:@"HelveticaNeue-Thin" size:30.f];self.label.textAlignment = NSTextAlignmentCenter;self.label.textColor     = [UIColor grayColor];[self.view addSubview:self.label];
}#pragma mark - 创建按钮以及按钮事件
- (void)createButton {UIButton *button = [[UIButton alloc] initWithFrame:self.view.bounds];[self.view addSubview:button];[button addTarget:selfaction:@selector(buttonEvent:)forControlEvents:UIControlEventTouchUpInside];
}
- (void)buttonEvent:(UIButton *)button {ChangeValueViewController *changeValueViewCV = [ChangeValueViewController new];// 获取数据changeValueViewCV.dataModel                  = self.dataModel;[self presentViewController:changeValueViewCVanimated:YEScompletion:^{}];
}#pragma mark - 控制器view
- (void)viewWillAppear:(BOOL)animated {self.label.text = [NSString stringWithFormat:@"%@-%@", self.dataModel.name, self.dataModel.age];NSLog(@"%@", self.dataModel.array);
}@end

只要DataModel被ViewController一直持有,所有的持有这个DataModel的控制器,修改了DataModel的值,就会影响到全局的值,这点需要注意哦。

转载于:https://www.cnblogs.com/YouXianMing/p/4198952.html

控制器属性传值的一些小问题相关推荐

  1. UI 07 _ 导航视图控制器 与 属性传值

    首先, 先创建三个VC. 完毕点击按钮, 进入下一页, 并可以返回. 要先把导航视图控制器创建出来. 在AppDelegate.m 文件里代码例如以下: #import "AppDelega ...

  2. IOS开发控制器之间传值的几种小方法

    在IOS开发中或面试中,经常会遇到,两个或者多个控制器之间传值的问题 ,总结的集中方法仅供参考! 问题 :将B控制器中的textField 输入内容,传到A控制器中的label上显示出来,如何传值? ...

  3. vue中传值和传引用_vue prop属性传值与传引用示例

    vue prop属性传值与传引用示例 vue组件在prop里根据type决定传值还是传引用. 简要如下: 传值:String.Number.Boolean 传引用:Array.Object 若想将数组 ...

  4. 从视图到控制器的传值方法(表单)

    从视图到控制器的传值方法(表单) Views中: 将数据提交到某个控制器的方法中,在该方法中去做处理 <form action="/控制器/get"method=" ...

  5. eazyui ajax传值,jquery easyui ajax data属性传值方式

    $.ajax({ url:url, type:'post', data:data, dataType:'json', contentType: "application/x-www-form ...

  6. 四大传值详解:属性传值,单例传值,代理传值,block传值

    一:属性传值 传值情景:从前一个页面向后一个页面传值 a.在后一个页面,根据传值类型和个数,写属性 b.在前一个页面, 为属性赋值 c.在后一个页面, 使用值 例如: 第一个视图: #import & ...

  7. iOS属性传值传递不过去

    2019独角兽企业重金招聘Python工程师标准>>> 有时候,我们在进行属性传值的时候,会发现传递过去的属性是空值,即为null,导致原因是: 因为属性传值,有时候我们在init里 ...

  8. vue用公共组件页面传值_微信小程序页面传值、组件间通信总结

    小程序是一种新的开放能力,开发者可以快速地开发一个小程序.小程序可以在微信内被便 捷地获取和传播,同时具有出色的使用体验.对于微信小程序,前端开发应该不陌生,目前也 是非常火,很多公司都会进行开发.对 ...

  9. IOS开发UI篇—导航控制器属性和基本使用

    IOS开发UI篇-导航控制器属性和基本使用 一.导航控制器的一些属性和基本使用 1.把子控制器添加到导航控制器中的四种方法 (1) 1.创建一个导航控制器 UINavigationController ...

最新文章

  1. webalizer日志分析软件的安装
  2. 几种经典的数据排序及其Java实现
  3. 零基础学习Java-素数和
  4. Codeforces Round #341 (Div. 2)
  5. HTML5实现输入密码(六个格子)
  6. 动态规划-hdoj-4832-百度之星2014初赛第二场
  7. 英国大学diploma(证书)期末考试挂科
  8. 计算机开机桌面黑,电脑开机后桌面自动变成黑色的
  9. 联想用u盘重装系统步骤_联想电脑怎样重新安装系统方法步骤详细教程 - 系统家园...
  10. 红孩儿编辑器的模块设计13
  11. C语言实现求最小公倍数。
  12. 走过30年岁月的WPS,它的复兴之路该怎么走
  13. 2016互联网金融安全峰会报名
  14. 49个终身受用的世界顶级思维(收藏)
  15. Tableau实用小技巧之——红绿色字体颜色设置
  16. IDC机房的PDU电源插座
  17. 【腾讯Bugly干货分享】Android 进程保活招式大全
  18. 花呗额度,为什么每个月只能修改一次。
  19. kanzi学习之路(序)
  20. 申请电子面单号API接口文档

热门文章

  1. python天天学怎么样-每天一遍,好好学习,天天向上(Python)
  2. python创建csv文件并写入-【已解决】Python中创建和保存数据到csv文件中
  3. python绘图实例-Python matplotlib基础绘图函数示例
  4. python爬虫从入门到精通-Python爬虫从入门到精通视频(2018新版)
  5. python能做什么游戏好-Python有做大型游戏的潜力吗?
  6. python爬虫赚钱的经历-聊一聊,这些年我用Python爬虫挣钱的那些事
  7. python详细安装教程3.7.4-Linux下Python3.7.4 安装教程
  8. python3.7安装numpy模块-Python3.7模块numpy
  9. 只会python好找工作吗-转行学Python能拿多少钱?二线工作好找吗?
  10. python代码块使用缩进表示-python中的代码块使用缩进来表示。