APP & program

iOS - 关键字@synthesize、@dynamic、@p

2023-02-09  本文已影响0人  搬砖的crystal

在声明 property 属性后,有2种实现选择:
(1)@synthesize
编译器期间,让编译器自动生成 getter/setter 方法。
当有自定义的存或取方法时,自定义会屏蔽自动生成该方法。

(2)@dynamic
告诉编译器,不自动生成 getter/setter 方法,避免编译期间产生警告,然后由自己实现存取方法。
或存取方法在运行时动态创建绑定:主要使用在 CoreData 的实现 NSManagedObject 子类时使用,由Core Data 框架在程序运行的时动态生成子类属性。

同时重写 getter/setter 方法

很少同时重写 getter/setter 方法,一般的话,大概都是使用懒加载方法,然后重写 getter 方法,做一个非空判断。要同时重写属性的 getter/setter,系统就会报错误:Use of undeclared identifier '_string'; did you mean 'string'?

OC 最初设定 @property@synthesize 的作用:
@property 的作用是定义属性,声明 getter/setter 方法。(注意:属性不是变量)
@synthesize 的作用是实现属性的,如 getter/setter 方法。

后来因为使用 @property 灰常频繁,就简略了@synthesize 的表达。
从 Xcode4.4 以后 @property 已经独揽了@synthesize 的功能。

主要作用:
(1)生成了私有的带下划线的的成员变量因此子类不可以直接访问,但是可以通过 getter/setter 方法访问。那么如果想让定义的成员变量让子类直接访问那么只能在.h文件中定义成员变量了,因为它默认是 @protected
(2)生成了getter/setter 方法的实现当:用 @property 声明的成员属性,相当于自动生成了 getter/setter 方法,如果重写了 getter/setter 方法,与 @property 声明的成员属性就不是一个成员属性了,是另外一个实例变量,而这个实例变量需要手动声明。所以会报错误。

总结:一定要分清属性和变量的区别,不能混淆。@synthesize 声明的属性=变量。意思是,将属性的 getter/setter 方法,作用于这个变量。

同时重写解决办法如下:

@interface ViewController ()
@property (nonatomic, strong)NSString *string;
@end
@implementation ViewController

//添加以下代码解决
@synthesize string = _string;

-(NSString *)string{
    return _string;
}

-(void)setString:(NSString *)string{
    _string = string;
}

-(void)viewDidLoad{
    [super viewDidLoad];
}

@end
上一篇 下一篇

猜你喜欢

热点阅读