• 叙利亚避谈战中国是否摆大巴 人员严重不整花式缺阵 2018-05-11
  • 男子嫖娼后恋上卖淫女 女子外出约会被其砍杀 2018-05-11
  • 郭家耀:料指数于23200至23800点水平徘徊 2018-05-05
  • 海外热身天津遭惨败 队长:跟高水平打才能学习 2018-05-05
  • 中国首个海外基地为何选吉布提?扼守全球最重要航道 2018-05-05
  • 张稀哲再示爱新婚妻子:遇到对的人 有你就知足 2018-05-04
  • 崔龙洙称为输球会做自我反省 解拉米为何没进首发 2018-05-04
  • 特朗普打破惯例 罕见“优待”中国记者 2018-05-04
  • 英国脱欧后都柏林能否成为欧洲新金融中心 2018-05-03
  • 英国明年3月底前将启动脱欧程序 脱欧时间表一览 2018-05-03
  • 加拿大“网红”柯基因病辞世 粉丝超70万 2018-05-03
  • BFS牛汇:菲律宾政局动荡 比索面临贬值压力 2018-05-02
  • 哈勃望远镜捕捉到垂死恒星:如蝴蝶蹁跹(图) 2018-05-02
  • 揭秘:小检察官如何替人“消灾” 买通公安法院 2018-05-02
  • 爱神罕见粗口回应外界质疑:老子一点都不在乎 2018-05-01
  • 注册 登录
    主题 : 关于@property自动生成的set方法
    级别: 新手上路
    UID: 579921
    精华: 0
    发帖: 9
    可可豆: 27 CB
    威望: 27 点
    在线时间: 66(时)
    注册时间: 2016-08-28
    最后登录: 2018-04-26
    0 楼:  发表于: 2018-04-19 17:08    发自: Web Page
    来源于 一般提问 分类

    围棋的玩法:关于@property自动生成的set方法   

    有人知道自动生成的set方法里面都做什么了么?因为我现在给某个类声明了一个NSString属性
     36选7玩法 www.mnaki.com 
    
    @property (copy, nonatomic)NSString *name;
    
    

    然后在别的类调用的该方法的时候传的是NSMutablString,理论上属性我声明成了copy,然后传的NSMutablString值发生了变化,不是应该不影响属性么。但是我发现如果重写了set方法后,属性的值会随着变化。
    完整代码如下:
    a.h
    @interface SubViewController : UIViewController
    @property (copy, nonatomic)NSString *name;
    @end
    


    a.m
    
    @implementation SubViewController
    
    - (instancetype)init
    {
        self = [super init];
        if (self) {
            [self createUI];
        }
        return self;
    }
    
    -(void)createUI{
        [self.view setBackgroundColor:[UIColor whiteColor]];
        
        self.lblTitle = [[UILabel alloc] initWithFrame:CGRectMake(100, 80, 200, 80)];
        [_lblTitle setTextColor:[UIColor redColor]];
        [_lblTitle setTextAlignment:NSTextAlignmentCenter];
        [self.view addSubview:self.lblTitle];
    }
    
    -(void)setName:(NSString *)name{
        _name = name;
    }
    
    
    

    PS:不重写上面的setName方法后,传入的nsmutablestring如何变化,name都无影响,但是加上后name的值会随着传入参数的变化而变化,我声明用的是copy为什么还会出现这种情况,为什么使用默认的set方法就没问题
    关键词: 代码 ios
    级别: 骑士
    状态: 连续签到 - [110天]
    UID: 458935
    精华: 0
    发帖: 280
    可可豆: 877 CB
    威望: 689 点
    在线时间: 892(时)
    注册时间: 2015-04-07
    最后登录: 2018-04-26
    1 楼:  发表于: 2018-04-19 17:45    发自: Web Page
    老铁 ,重写set方法的话,_name就是你自己定义的变量,如果不重写set方法的话是系统默认是_name.  方法的重写就是吧方法逻辑改了。
    级别: 新手上路
    UID: 579921
    精华: 0
    发帖: 9
    可可豆: 27 CB
    威望: 27 点
    在线时间: 66(时)
    注册时间: 2016-08-28
    最后登录: 2018-04-26
    2 楼:  发表于: 2018-04-19 17:57    发自: Web Page
    回 1楼(午夜狂欢) 的帖子
    啊可能我没说清楚,这个set方法只在初始化的时候调用一次,之后就再也不用了。但是因为调用时候我传的的是NSMutableString,所以之后当传入的值发生变化的时候,会导致我这个a类里的name的值跟随变化(因为传入的指针没变但是指针的值变了),所以我声明属性的时候使用的copy(name值应该不会再变了)。但是我不明白为什么当我重写set方法后,这个name值仍然会跟随传入的参数的值变化(此时没有调set方法),我想问的是我这个set和系统默认生成的set方法有什么区别
    级别: 新手上路
    UID: 579921
    精华: 0
    发帖: 9
    可可豆: 27 CB
    威望: 27 点
    在线时间: 66(时)
    注册时间: 2016-08-28
    最后登录: 2018-04-26
    3 楼:  发表于: 2018-04-19 17:58    发自: Web Page
    我其实只是想知道,系统默认生成的set方法是怎么写的,跟我这个有什么区别。。
    级别: 新手上路
    UID: 395371
    精华: 0
    发帖: 10
    可可豆: 37 CB
    威望: 37 点
    在线时间: 347(时)
    注册时间: 2014-11-04
    最后登录: 2018-04-24
    4 楼:  发表于: 2018-04-19 18:25    发自: Web Page
    你重写了set方法之后声明的copy就没什么意义了,你在自己的set里面改成 _name = [name mutableCopy]; 试试?
    级别: 新手上路
    UID: 579921
    精华: 0
    发帖: 9
    可可豆: 27 CB
    威望: 27 点
    在线时间: 66(时)
    注册时间: 2016-08-28
    最后登录: 2018-04-26
    5 楼:  发表于: 2018-04-20 09:57    发自: Web Page
    回 4楼(ylyer) 的帖子
    噢是说如果我声明的是copy的话,在他默认的set方法中生成的就是 _name = [name mutableCopy];
    而如果我声明称string的话,他set方法则是 _name = name;
    是这个意思么。。?
    级别: 侠客
    状态: 连续签到 - [70天]
    UID: 622302
    精华: 0
    发帖: 64
    可可豆: 489 CB
    威望: 365 点
    在线时间: 225(时)
    注册时间: 2017-08-29
    最后登录: 2018-04-26
    6 楼:  发表于: 2018-04-20 10:06    发自: Web Page
    回 楼主(jackieAsssd) 的帖子
    //nonatomic
    - (void)setName:(NSString *)name {
       if (_name != name) {
           [_name release];
           _name = [name retain];
       }
    }
    - (NSString *)name {
        return _name;
    }

    级别: 新手上路
    UID: 579921
    精华: 0
    发帖: 9
    可可豆: 27 CB
    威望: 27 点
    在线时间: 66(时)
    注册时间: 2016-08-28
    最后登录: 2018-04-26
    7 楼:  发表于: 2018-04-20 10:24    发自: Web Page
    回 6楼(追小沐) 的帖子
    这个是MRC的吧,那ARC的呢。。?
    另外这个[name retain] 这句是返回指向的name指针么?
    级别: 侠客
    状态: 连续签到 - [70天]
    UID: 622302
    精华: 0
    发帖: 64
    可可豆: 489 CB
    威望: 365 点
    在线时间: 225(时)
    注册时间: 2017-08-29
    最后登录: 2018-04-26
    8 楼:  发表于: 2018-04-20 10:52    发自: Web Page
    回 7楼(jackieAsssd) 的帖子
    - (void)setName:(NSString *)name {
        if (_name != name) {
            _name = nil;
            _name = [name copy];
        }
    }
    这样。
    级别: 新手上路
    UID: 579921
    精华: 0
    发帖: 9
    可可豆: 27 CB
    威望: 27 点
    在线时间: 66(时)
    注册时间: 2016-08-28
    最后登录: 2018-04-26
    9 楼:  发表于: 2018-04-20 11:46    发自: Web Page
    回 8楼(追小沐) 的帖子
    不好意思我还是有一些不明白,首先是为什么要判_name != name这个呢,因为如果要是下面是copy的话,_name和name的指针一定不等啊,是不是这个判断就没有必要了
    第二个问题是,为什么要_name = nil;赋空呢,直接重新赋值不就好了
    描述
    快速回复

    关注本帖(如果有新回复会站内信通知您)

    发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

    按"Ctrl+Enter"直接提交
      顶部