文档章节

Ios中属性关键字@property

_
 _OUTMAN_
发布于 2017/05/23 08:50
字数 880
阅读 21
收藏 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

© 著作权归作者所有

共有 人打赏支持
上一篇: Fragment生命周期
下一篇: Ios中点语法
_
粉丝 21
博文 133
码字总数 63959
作品 0
海淀
程序员
私信 提问
2018 iOS 面试题大全(补充完整版)

原文地址:2018 iOS 面试题大全 由于原作者并没有继续更新,这里我转过来继续更新下 这个栏目将持续更新--请iOS的小伙伴关注! 1、iOS 应用导航模式有哪些? 2、iOS 中持久化方式有哪些? 3、...

Theendisthebegi
11/15
0
0
iOS中UIWebView的使用详解

iOS中UIWebView的使用详解 一、初始化与三种加载方式 UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种: 第一种: - (voi...

珲少
2015/06/23
0
1
IOS学习,最简单的表格应用程序,学习,列出博客

IOS编程浅蓝教程,这是博客地址http://www.cnblogs.com/haichao/category/425378.html IOS编程浅蓝教程:锲子 IOS编程浅蓝教程(一)先决条件:开始iOS编程的必要准备 IOS编程浅蓝教程(二) Hel...

andy521zhu
2015/01/17
0
0
一、Objective-C概述

说明:这个Objective-C专题,是学习iOS开发的前奏,也为了让有面向对象语言开发经验的程序员,能够快速上手Objective-C。如果你还没有编程经验,或者对Objective-C、iOS开发不感兴趣,请忽略...

长平狐
2013/03/28
128
0
iPhone开发之深入浅出 (2) — ARC之@property使用

上一回我们学到了一些ARC的基本概念,这一次我们来看看ARC对@property的使用规则有何影响。 所有者属性 我们先来看看与所有权有关系的属性,关键字间的对应关系。 属性值 关键字 所有权 stro...

小小贝
2012/12/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

day177-2018-12-14-英语流利阅读-待学习

艾滋病的治愈方法是否触手可及? Daniel 2018-12-14 1.今日导读 几十年来,艾滋病一直是世界上最难对付的“超级绝症”之一,从人类历史上第一次诊断出艾滋病病例的 20 世纪 80 年代早期到 20...

飞鱼说编程
32分钟前
5
0
java 合成两张图片或图片与二维码

java中偶尔会出现需要将一张小图片嵌入大图中或带二维码的海报图片,那么本文就是奔着这个目的来的,直接上腊肉! zxing是生成1D和2D条形或二维码的工具类库,java图形库Graphics2D进行图片的...

貔貅叔
37分钟前
2
0
80后阿里P10,“关老板”如何带着MaxCompute一路升级?

我是个幸运的人。虽然幸运不能被复制,但是眼光和努力可以。 关涛/关老板,80后的阿里P10,阿里巴巴通用计算平台负责人,阿里巴巴计算平台研究员。12年职场人生,微软和阿里的选择。 关涛的花...

阿里云官方博客
53分钟前
2
0
开源软件和开源模式面临的生存危机

开源模式可能正面临一场危机。越来越多的开源软件和平台被大型云计算服务商融入自家的云服务体系,并以此获利颇丰,但并不支付费用,也没有对开源社区做出相应的回馈。而实际上,大部分开源软...

Linux就该这么学
53分钟前
2
0
统一服务消息返回错误:{"errcode":40165,"errmsg":"invalid weapp pagepath hint: [bsAWua0201ge30]"}

{"errcode":40165,"errmsg":"invalid weapp pagepath hint: [bsAWua0201ge30]"} 原因:pagepath参数为所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar), 以前配置的是:m...

tianma3798
55分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部