synthesize关键字的说明

15 篇文章 0 订阅

iOS6之后LLVM编译器引入了property autosynthesis, 即属性自动合成。换句话说,就是编译器会为每个@property添加@synthesze, 如以下形式 :

@synthesize propertyName = _propertyName;

这行代码会创造一个带下划线的实例变量名,同时使用这个属性生成getter和setter方法。

使用@synthesize 只有一个目的-给实例变量起个别名,或者说为同一个变量添加两个名字。

如果要阻止自动合成,记得使用@dynamic。经典的使用场景是你知道已经在某处实现了getter/setter方法,而编译器不知道的情况。 (为了防止编译器使用自动合成生成新的settter/getter 会覆盖已经存在旧的 setter/getter)。

自动合成没有任何内存的含义,所以它根本没有连接到ARC。

如果你已经手动实现了setter/getter方法,或者对 只读对象 实现了getter方法,那么自动合成不会产生任何影响。如果你在手动实现需要一个变量,只需要声明它就可以了,不需要添加@synthesize来添加一个别名(尽管可以)。

还有一种情形需要使用@synthesize,就是当在protocol(协议)中声明并实现属性时。协议中申明的属性不会自动生成setter和getter,[UiIApplicationDelegate window]就是个典型的例子。

情形1:不使用@synthesize,可以使用自动生成的带下划线的实例变量名。

情形2:使用@synthesize为属性添加带下划线的别名,与不使用@synthesize相同。

@synthesize声明的属性=变量。意思是,将属性的setter,getter方法,作用于这个变量。

@synthesize还有一个作用,就是可以指定与属性对应的实例变量,例如我可以这样写

@synthesize age = myAge; 那这样子的话我们去调用的时候self.age其实是操作的实例变量myAge,而不是_age了。

情形3: 使用@synthesize为属性添加任意别名,此时使用自动生成的实例变量名将报错,只能使用指定的别名。

注意

1 属性的setter方法和getter方法是不能同时进行重写的,这是因为,一旦同时重写了这两个方法,那么系统就不会帮你生成这个成员变量了,所以会报错,如果真的就想非要重写这个属性的setter和getter方法的话,就要手动生成成员变量,然后就可以重写了。或者是用

@synthesize: @synthesize age = myAge; - (void)setAge:(NSString *)age { myAge = age; } - (NSString *)age { return myAge; }

2 在getter方法中最后返回return _age; 而不是return self.age, 点语法实际上是对setter和getter方法的调用,如果在getter方法中调用return self.age的话,就会循环调用。

3 在重写属性的setter方法论的时候我们一般都是这样写:

- (void)setInfoArr:(NSArray *)infoArr{

_infoArr = infoArr;

_infoArr = @[@"我是数组"];

}

我们需要在setter方法中加上这句_infoArr = infoArr;, 我们在重写setter方法的时候将新值infoArr赋值给属性变量_infoArr 以便我们在外面调用。

4. 当.h 文件中属性为readonly, .m文件中可以不用@synthesize这个关键字,初始化的方式有下面几种

例如:

@property(nonatomic,strong,readony) UILabel *placeHolderLabel;

- (void)setUpPlaceHolderLabel { _placeHolderLabel = [[UILabel alloc] init]; _placeHolderLabel.textColor = [self.class defaultPlaceholderColor]; _placeHolderLabel.numberOfLines = 0; _placeHolderLabel.userInteractionEnabled = NO; _placeHolderLabel.font = self.font; }

- (UILabel *)placeHolderLabel { UILabel *label = objc_getAssociatedObject(self, @selector(placeHolderLabel)); if (!label) { label = [[UILabel alloc] init]; label.textColor = [self.class defaultPlaceholderColor]; label.numberOfLines = 0; label.userInteractionEnabled = NO; label.font = self.font; objc_setAssociatedObject(self, @selector(placeHolderLabel), label, OBJC_ASSOCIATION_RETAIN_NONATOMIC); [self updatePlaceholderLabel]; } return label; }

@property (nonatomic,strong,readwrite) UILabel *placeHolderLabel;

总结

1.@synthesize的作用:是为属性添加一个实例变量名,或者说别名。同时会为该属性生成setter/getter方法。

2. 禁止@synthesize:如果某属性已经在某处实现了自己的setter/getter,可以使用@dynamic来阻止@synthesize 自动生成新的setter/getter覆盖。

3.内存管理:@synthesize和ARC无关。

4.使用:一般情况下无需对属性添加@synthesize,但一些特殊情形任然需要,例如protocol中声明的属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值