文档章节

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

© 著作权归作者所有

共有 人打赏支持
_
粉丝 21
博文 133
码字总数 63959
作品 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
UISegmentedControl segmentedControl

一、简介 <UIControl-->UIView-->UIResponder-->NSObject 格式为 1-->初始化(作用) typedef NS_OPTIONS(NSUInteger, UIDataDetectorTypes) { UIDataDetector......

无邪8
05/22
0
0
iPhone开发之深入浅出 (2) — ARC之@property使用

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

小小贝
2012/12/24
0
0
-webkit-tap-highlight-color处理元素点击默认高亮

概述: -webkit-tap-highlight-color 是一个 不规范的属性(unsupported WebKit property),它没有出现在 CSS 规范草案中。 当用户点击iOS的Safari浏览器中的链接或JavaScript的可点击的元素...

欢乐小金鱼
2015/03/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 8 日期 示例

Java 8 推出了全新的日期时间API。Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。Java也意识到需...

阿刚ABC
34分钟前
1
0
RxJava操作符lift 笔记

在内部,每个Rx operator都做3件事: 它订阅源并观察值。 它根据操作员的目的转换观察到的序列。 它通过调用onNext,onError和onCompleted将修改后的序列推送到自己的订阅者。 compose运算符...

woshixin
36分钟前
1
0
lnmp+coreseek实现站内全文检索(安装篇)

软件安装包 安装环境 系统环境 centos7.2 1核2G 软件环境 coreseek-3.2.14 lnmp1.5 安装mmseg 更新依赖包和安装编译环境 yum -y install m4 autoconf automake libtoolyum -y install gcc g...

毛毛雨rain
48分钟前
1
0
MyCat实现读写分离

MyCat 官网:http://www.mycat.io/ 数据库分库 垂直拆分 垂直分库按照业务将项目中的数据库表分成很多库,比如:商品库、用户库、订单库、系统库…… 水平拆分 水平拆分也叫数据分片 MyCat简...

wangyanbao
49分钟前
1
0
Rancher 2.1全面发布,优化Kubernetes集群运维

GitLab支持、CICD优化、项目配额管理、驱散容器功能等等,Rancher 2.1给你带来一大票惊喜新功能!还有备着【千元大奖】的用户体验计划等你来参与! Rancher 2.1已于近日全面发布! Rancher ...

RancherLabs
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部