iOS基础之@property、@synthesize、@dynamic

前言

正文

一、@propety

eg:

#import 

@interface ViewController : UIViewController

@property (nonatomic,assign) int testNumber;

@end

简单理解:生成了一个_testNumber变量,并声明和实现了setTestNumber方法和testNumber方法

#import 

@interface ViewController : UIViewController
{
    int testNumber;
}
@end
#import "ViewController.h"

@implementation ViewController

- (void)setTestNumber:(int)number{
    _testNumber = number;
}
- (int)getTestNumber{
    return _testNumber;
}

@end
二、@synthesized

eg:
默认实现

#import 

@interface ViewController : UIViewController

@property (nonatomic,assign) int testNumber;

@end

#import "ViewController.h"

@implementation ViewController

@synthesize testNumber;

@end

相当于这样:

#import 

@interface ViewController : UIViewController
{
    int testNumber;
}
- (void)setTestNumber:(int)number;
- (int)testNumber;
@end
#import "ViewController.h"

@implementation ViewController

- (void)setTestNumber:(int)number{
    testNumber = number;
}
- (int)testNumber{
    return testNumber;
}
@end

解释:@synthesized 默认相当于声明了一个成员变量testNumber,并且生成的set、get方法也是指向testNumber的。(不是指向_ testNumber)

Important: If you use @synthesize without specifying an instance variable name, like this:
@synthesize firstName;
the instance variable will bear the same name as the property.
In this example, the instance variable will also be called firstName, without an underscore.

2.指定
此时set/get方法就指向了成员变量egNumber。

#import 

@interface ViewController : UIViewController

@property (nonatomic,assign) int testNumber;

@end
#import "ViewController.h"

@implementation ViewController

@synthesize testNumber = egNumber;

@end

相当于:

#import 

@interface ViewController : UIViewController
{
    int egNumber;
}
- (void)setTestNumber:(int)number;
- (int)testNumber;
@end
#import "ViewController.h"

@implementation ViewController

- (void)setTestNumber:(int)number{
    egNumber = number;
}
- (int)testNumber{
    return egNumber;
}
@end

解释:@ synthesize testNumber = egNumber 这句代码相当于把set、get方法的目标指向了egNumber。
当egNumber变为_testNumber时,就和我们现在@propety声明一个属性的作用一样了。
扩展点:想在一个类里@propety声明一个属性后,要同时重写它的set、get方法,需要写上@synthesize testNumber = _testNumber;才不会报错。

三、@dynamic

用这个修饰的属性,主要是告诉编译器:
这个属性的set、get方法不需要系统提供,我会自己动态(runtime一些方法)生成。
eg:
1.分类不能添加成员变量,可以为他添加属性,属性的set、get方法的实现,需要使用关联属性方法 2.编译期间使用到该属性的set和get方法时不要报错
2.coreData里使用

结束语:

磨刀不误砍柴功,不慌不忙,练好基本功,相信美好的事情即将发生

参考来源:
iOS知识梳理 - Objective-C的@property、@synthesize和@dynamic
相关学习:
iOS 局部变量和全局变量以及成员变量的区别

iOS基础之@property、@synthesize、@dynamic_第1张图片
初雪故宫一角.png

你可能感兴趣的:(iOS基础之@property、@synthesize、@dynamic)