Ios中属性关键字@property
Ios中属性关键字@property
xingjm8511 发表于6个月前
Ios中属性关键字@property
  • 发表于 6个月前
  • 阅读 20
  • 收藏 0
  • 点赞 0
  • 评论 0

先来介绍下Ios中实例变量的定义

1. 一般都是在.h中通过{}来声明实例变量,这种属于public的,其他类也可以访问,需要定义setter和getter方法的声明。也可以使用@property关键字进行关联,由系统默认生成setter和getter声明。

2. XCode5.1 以后,@property关键字,不仅在.h中默认实现setter和getter方法的声明,还会在.m文件中实现@synthesize的功能。所以,没在{}定义,只使用@property关键字定义的变量,是private的,只在.m中可以访问。外部访问,需要通过setter和getter方法。

@synthesize  在.m文件中使用,展开setter和getter方法的实现,还展开了实例变量的定义。但该实例变量的定义,只在.m中定义,外部文件无法访问。

通过demo了解下

1. 使用{}声明变量,使用@property声明setter和getter,使用@synthesize实例化,实现setter和getter。

@interface IosGrammar : NSObject
{
    NSString *_place;
}
@property NSString *place;

// 相当于定义了setter和getter方法
// - (void) setPlace(NSString *p);
// - (NSString *) place();

- (id) init;

- (void) printIos;

+ (void) testIos;

@end
@implementation IosGrammar

@synthesize place;
// 相当于新定义变量,并实现其setter和getter方法
//{
//    NSString *place;
//}

- (id) init {
    self = [super init];
    return self;
}

- (void) printIos {
    NSLog(@"_place is %@", _place);
}

+ (void) testIos {
    IosGrammar *ios = [[IosGrammar alloc] init];
    ios.place = @"北京海淀";

    [ios printIos];
}

@end
// 输出结果
// IosDemo[3586:232945] _place is (null)
// 并没有给_place变量赋值,因为@synthesize默认会定义新的变量place,及其setter和getter方法

2. 使用@synthesize关联.h中{}定义的变量

@implementation IosGrammar

@synthesize place = _place;
// 相当于实现_place变量的setter和getter方法

- (id) init {
    self = [super init];
    return self;
}

- (void) printIos {
    NSLog(@"_place is %@", _place);
}

+ (void) testIos {
    IosGrammar *ios = [[IosGrammar alloc] init];
    ios.place = @"北京海淀";

    [ios printIos];
}

@end
// 输出结果
// IosDemo[3608:235229] _place is 北京海淀
// 关联_place,相当于实现其setter和getter方法

3. 不使用@synthesize属性

@interface IosGrammar : NSObject
{
    NSString *_place;
}
@property NSString *place;

- (id) init;

- (void) printIos;

+ (void) testIos;

@end
@implementation IosGrammar

//@synthesize place = _place;

- (id) init {
    self = [super init];
    return self;
}

- (void) printIos {
    NSLog(@"_place is %@", _place);
}

+ (void) testIos {
    IosGrammar *ios = [[IosGrammar alloc] init];

    ios.place = @"北京海淀";
    
    [ios printIos];
}

@end
// 输出结果
// IosDemo[3608:235229] _place is 北京海淀
// 结果和使用@synthesize place = _place 一致

4. 不在{}声明变量

@interface IosGrammar : NSObject
{
    NSString *_place;
}
@property NSString *place;
@property NSInteger weight;//不在{}中声明

- (id) init;

- (void) printIos;

+ (void) testIos;

@end
@implementation IosGrammar

//@synthesize place = _place;

- (id) init {
    self = [super init];
    return self;
}

- (void) printIos {
    NSLog(@"_place is %@", _place);
    NSLog(@"_weight is %li", _weight);//没有{}中声明,只使用@property,一样可以使用_weight变量
}

+ (void) testIos {
    IosGrammar *ios = [[IosGrammar alloc] init];

    ios.place = @"北京海淀";
    ios.weight = 50;
    
    [ios printIos];
}

@end
// 输出结果
// IosDemo[3608:235229] _place is 北京海淀
// IosDemo[3711:240937] _weight is 50

可见 @property NSInteger weight;
相当于定义了变量_weight,并实现setter和getter方法。所以在Ios中可以使用@property定义变量即可

二、修饰符

简单介绍几种修饰符

// assign copy retain

assign(默认 直接赋值 主要修饰基本数据类型)  

copy (先release 再copy 主要修饰字符串及子类) NSString NSMutableString

retain  (先release 再retain 主要修饰除基本类型及字符串以外的类型)

// atomic nonatomic  多线程中使用,防止内存泄漏、实例变量取值错误

为了强调访问实例变量的效率,在单线程时,使用nonatomic修饰

atomic(默认) 原子性

nonatomic 非原子性

// setter getter 重命名默认的set和get方法

// readonly readwrite(默认)

@property NSInteger age

@property (assign, nonatomic) NSInteger age;

@property (copy, nonatomic) NSString *name;

@property (retain, nonatomic) NSArray *array;

@property (setter=setterPlace:, getter=getterPlace) NSString *place;

place默认的是setPlace:和getPlace,使用setter和getter修饰符,就变成了setterPlace:和getterPlace

共有 人打赏支持
粉丝 18
博文 109
码字总数 45031
×
xingjm8511
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: