文档章节

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

© 著作权归作者所有

共有 人打赏支持
_
粉丝 20
博文 130
码字总数 55043
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

配置Spring的注解支持

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 配置Spring的注解支持 以上也提到了使用注解来配...

凯哥学堂
40分钟前
0
0
关于Spring Aop存在的一点问题的思考

在本人前面的文章Spring Aop原理之切点表达式解析中讲解了Spring是如何解析切点表达式的,在分析源码的时候,出现了如下将要讲述的问题,我认为是不合理的,后来本人单纯使用aspectj进行试验...

爱宝贝丶
42分钟前
0
0
JavaScript 概述

JavaScript是面向Web的编程语言。绝大多数现代网站都使用了JavaScript,并且所有的现代Web浏览器——基于桌面系统、游戏机、平板电脑和智能手机的浏览器——均包含了JavaScript解释器。这使得...

Mr_ET
今天
0
0
Java Run-Time Data Areas(Java运行时数据区/内存分配)

Java运行时数据区(内存分配) 本文转载官网 更多相关内容可查看官网 中文翻译可参考 2.5. Run-Time Data Areas The Java Virtual Machine defines various run-time data areas that are use...

lichuangnk
今天
0
0
docker learn :services docker-compose.yml

docker-compose.yml定义了服务的运行参数 version: "3" services: web: # replace username/repo:tag with your name and image details image: hub.c.163.com/dog948453219/friendlyhello d......

writeademo
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部