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

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

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

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

效果演示图:

测试用源码:

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:self
               action:@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];

    // 数据model
    self.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:self
               action:@selector(buttonEvent:)
     forControlEvents:UIControlEventTouchUpInside];
}
- (void)buttonEvent:(UIButton *)button {
    ChangeValueViewController *changeValueViewCV = [ChangeValueViewController new];

    // 获取数据
    changeValueViewCV.dataModel                  = self.dataModel;

    [self presentViewController:changeValueViewCV
                       animated:YES
                     completion:^{

                     }];
}

#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的值,就会影响到全局的值,这点需要注意哦。

时间: 2024-10-30 15:09:16

控制器属性传值的一些小问题的相关文章

ios-IOS 属性传值问题?????

问题描述 IOS 属性传值问题????? 各位大神好,我刚刚接手了一个项目,正在理解其中的代码,有一处地方我十分不解.一个页面的属性既没有被初始化有没有被赋值,当我把断点打在viewdidload方法开始处时来看这个属性的值,我发现它居然是有值的,而且这个值是正常的.我搜索整个工程发现也没有发现通过push传值的影子,回调的话我也没看出来,因为就这么几段代码压根没有block.请问这是为啥?请大神们不吝赐教.谢谢啦! 解决方案 IOS 属性传值IOS传值:属性传值IOS传值-属性传值 解决方案二

C#中使用反射遍历一个对象属性及值的小技巧

  这篇文章主要介绍了C#中使用反射遍历一个对象属性及值的小技巧,这在很时候应该都非常有用,本文直接给出实例代码,需要的朋友可以参考下 总结: 对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射): 代码如下: Type t = tc.GetType();//获得该类的Type //再用Type.GetProperties获得PropertyInfo[],然后就可以用foreach 遍历了 foreach (PropertyInfo pi in t.GetProperti

java-struts中模型驱动传值和属性传值

问题描述 struts中模型驱动传值和属性传值 如题.有什么优缺点,最好有简单代码事例.模型驱动传值和属性驱动传值 解决方案 http://bbs.csdn.net/topics/391913643

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

一.导航控制器的一些属性和基本使用 1.把子控制器添加到导航控制器中的四种方法 (1) 1.创建一个导航控制器 UINavigationController *nav=[[UINavigationControlleralloc]init]; 2.设置导航控制器为window的根视图 self.window.rootViewController=nav; 3.添加 YYOneViewController *one = [[YYOneViewController alloc] init]; [nav

css 的border属性改变hr颜色小示例

hr颜色如何改变,详细有很多的朋友都不清楚吧,其实很简单使用css便可做到,下面有个不错的示例,感兴趣的朋友可以参考下   html中用css改变颜色, 复制代码 代码如下: <hr style="border:0;background-color:#ff0000;height:1px;"> 如果不加border:0;的话,虽然颜色改变了,但是会显示一条黑色的边框. 如果不加height:1px;的话,在firefox下会不显示.

导航控制器&amp;amp;nbsp;UI_08(上)

主要内容:UINavigationController 重要:属性传值(向后一个界面传值).代理传值(向前相邻的界面传值).单例传值(不相邻的界面向前传值) 1.UINavigationController   导航控制器,是用来管理多个单视图控制器的控制器,此时他管理的多个单视图控制器之前有一定的层级关系(依赖关系,即下一个页面的出现要依赖于上一个页面),导航视图控制器创建时也会自带一个View,之不过此时它上面有来年各个子视图,一个是contentView ,一个是navigationBar

UIPassValue页面传值&amp;amp;nbsp;UI_08(下)

2.从前一个界面到后一个界面 注意:解题思路  葵花宝典:属性传值  第一步:在下一个界面视图控制器的.h文件中定义一个属性  第二步:在push之前将数据存储到属性中  第三步:取出属性中的值让控件显示  从后一个界面往前一个界面传值  辟邪剑谱:代理传值 代理传值示意图: 注意:从后一个页面往前不相邻的一个界面传值用单例 ------------------------------ AppDelegate.m  //创建根视图控制器firstVC     FirstViewControlle

iOS开发中导航控制器的基本使用教程_IOS

多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个view时,可以用一个大的view去管理1个或者多个小view,控制器也是如此,用1个控制器去管理其他多个控制器 比如,用一个控制器A去管理3个控制器B.C.D.控制器A被称为控制器B.C.D的"父控制器":控制器B.C.D的被称为控制器A的"子控制器" 为了便于管理控制器,iOS提供了2个

javascript中类的属性分析

本篇文章主要针对javascript的属性进行分析,由于javascript是一种基于对象的语言,本身没有类的概念,所以对于javascript的类的定义有很多名字,例于原型对象,构造函数等,它们都是指javascript中的类. 例如:function Person(){} var p = new Person(); 这里的Person可以看作一个类,而p则是这个类的实例也可以称为对象.这里主要分析js里面的四种属性. 私有属性,指定义在类中用var声明的,即var propertyName