码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-02 23:34:13      阅读:343      评论:0      收藏:0      [点我收藏+]

标签:

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

技术分享

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

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

效果演示图:

技术分享

测试用源码:

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

 

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

标签:

原文地址:http://www.cnblogs.com/YouXianMing/p/4198952.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!