注册 登录
主题 : 关于@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"直接提交
    幸运飞艇5码公式 | 幸运飞艇开奖直播app | 北京pk | 幸运农场官网 | 重庆幸运农场预测结果 | 重庆幸运农场开奖历史 | 北京赛车pk10高手心得 | 幸运飞艇定位公式 | 734| 885| 586| 640| 485| 426| 919| 692| 999| 685| 顶部