关于@property自动生成的set方法

[复制链接]
74 14
有人知道自动生成的set方法里面都做什么了么?因为我现在给某个类声明了一个NSString属性
@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方法就没问题

举报 使用道具

回复

14 个评论

222222  新手上路  发表于 2018-5-21 06:07:17  | 显示全部楼层
第一个判断是判断是否是同样的值,如果是直接不用进行下面操作了。

第二个 = nil 是把_name原来的指针及时的释放掉,不然copy了新的指针地址,原来的指针地址去哪里呢。

个人理解,如有不对请多多指教。

举报 使用道具

回复
xcx  新手上路  发表于 2018-5-21 06:36:27  | 显示全部楼层
你重写了set方法之后声明的copy就没什么意义了,你在自己的set里面改成 _name = [name mutableCopy]; 试试?

举报 使用道具

回复
jinguijian  新手上路  发表于 2018-5-21 06:43:39  | 显示全部楼层
- (void)setName:(NSString *)name {
    if (_name != name) {
        _name = nil;
        _name = [name copy];
    }
}
这样。

举报 使用道具

回复
mokaw  新手上路  发表于 2018-5-21 07:12:15  | 显示全部楼层
_name = name
这是你自己写的吧?
是你自己写的还问个毛线.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

举报 使用道具

回复
1631  新手上路  发表于 2018-5-21 07:16:35  | 显示全部楼层
啊可能我没说清楚,这个set方法只在初始化的时候调用一次,之后就再也不用了。但是因为调用时候我传的的是NSMutableString,所以之后当传入的值发生变化的时候,会导致我这个a类里的name的值跟随变化(因为传入的指针没变但是指针的值变了),所以我声明属性的时候使用的copy(name值应该不会再变了)。但是我不明白为什么当我重写set方法后,这个name值仍然会跟随传入的参数的值变化(此时没有调set方法),我想问的是我这个set和系统默认生成的set方法有什么区别

举报 使用道具

回复
awei  新手上路  发表于 2018-5-21 07:22:57  | 显示全部楼层
//nonatomic
- (void)setName:(NSString *)name {
   if (_name != name) {
       [_name release];
       _name = [name retain];
   }
}
- (NSString *)name {
    return _name;
}

举报 使用道具

回复
groupliu  新手上路  发表于 2018-5-21 07:27:25  | 显示全部楼层
我其实只是想知道,系统默认生成的set方法是怎么写的,跟我这个有什么区别。。

举报 使用道具

回复
不知叫啥好  新手上路  发表于 2018-5-21 07:48:49  | 显示全部楼层
老铁 ,重写set方法的话,_name就是你自己定义的变量,如果不重写set方法的话是系统默认是_name.  方法的重写就是吧方法逻辑改了。

举报 使用道具

回复
ttking  新手上路  发表于 2018-5-21 08:45:48  | 显示全部楼层
有人知道自动生成的set方法里面都做什么了么?因为我现在给某个类声明了一个NSString属性
@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.irunthink.com
搜索
热搜: iOS swift 下拉刷新

图文热点

更多

开发教程

更多

客服中心

400-800 周一至周日 9:30-17:30 仅收市话费

关注我们

  • 微信扫描
  • 关注微信
关于我们
关于我们
友情链接
联系我们
帮助中心
精贴推荐
源码上传
注册登录
服务支持
资源下载
关注我们
官方微博
官方空间
快速回复 返回顶部 返回列表