文档章节

Ios中属性关键字@property

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

© 著作权归作者所有

共有 人打赏支持
_
粉丝 20
博文 126
码字总数 55043
作品 0
海淀
程序员
UISegmentedControl segmentedControl

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

无邪8 ⋅ 05/22 ⋅ 0

经过阿里,百度一面,二面后,我总结了50道iOS面试题

前言: 金三银四已经过去,根据统计,很多人都会选择在三月四月跳槽,原因有很多,企业年后会有大量员工离职,员工觉得老公司待遇不怎么样?薪资不够高,想换个新环境等等原因,所以,三月四...

原来是泽镜啊 ⋅ 05/04 ⋅ 0

Dhar/YTTInjectedContentKit

YTTInjectedContentKit iOS壳版本场景下的批量修改类名、属性名、插入混淆代码、修改项目名称的shell脚本 具体的实现和使用方法请参考我的博客文章: iOS使用shell脚本注入混淆内容 iOS使用S...

Dhar ⋅ 05/04 ⋅ 0

iOS逆向工程- 学习整理(工具详解)

前言 一、逆向工程的要求 具备丰富的 iOS 开发经验 最好能非常熟悉 iOS 设备的硬件构成,iOS 系统的运行原理。 拿到任意一个 App 之后能够大致推断出它的项目规模和使用的技术,比如它的MVC模...

_小迷糊 ⋅ 05/11 ⋅ 0

【AR】开始使用Vuforia开发iOS(2)

原 设置iOS开发环境 安装Vuforia iOS SDK 如何安装Vuforia iOS示例 编译并运行Vuforia iOS示例 支持iOS金属 iOS 64位迁移 设置iOS开发环境 适用于iOS的Vuforia引擎目前支持运行iOS 9及更高版...

lichong951 ⋅ 06/11 ⋅ 0

如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊 ⋅ 05/26 ⋅ 0

常见的移动端H5页面开发遇到的坑和解决办法

手机共通问题 问题一:用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经研究发现是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率来显示网页字会非常小,所以苹果...

webmirror ⋅ 05/02 ⋅ 0

c++ cout 控制精度、宽度、进制

设置以上这些属性均有两种写法 一种是调用cout的方法 暂且叫做方法写法 一种是用到iomanip的函数 叫做控制器写法 一、精度 控制器写法: cout << setprecision(5); cout << fixed; 方法写法:...

apachecn_飞龙 ⋅ 2014/03/06 ⋅ 0

iOS源码补完计划--AFNetworking 3.1.0源码研读

参拜一下AFNetworking的源码。 第四篇源码、暂时来看也是iOS方向的最后一篇、撸完准备趁着热乎撸一撸网络协议。 目录 准备工作 功能模块 AFURLSessionManager/AFHTTPSessionManager AFNetwo...

kirito_song ⋅ 05/25 ⋅ 0

iOS ZipperDown 漏洞来袭,我们该如何应对?

  昨天傍晚盘古实验室负责任的披露了针对 iOS 应用的 ZipperDown 漏洞,并提供了检索、查询受影响应用的平台: zipperdown.com。基于目前公开的信息,该漏洞的影响面比较大,15000 多个应用...

FreeBuf ⋅ 05/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具

压缩打包介绍 使用压缩工具的好处: 使用压缩文件,不仅可以节省磁盘空间,而且在传输时还能节省网络宽带。 我们通常讲的家用宽带和机房宽带100M是有区别的: 机房宽带的上行和下行都是100M,...

Linux_老吴 ⋅ 18分钟前 ⋅ 0

SpringBoot热部署加持

概述 进行SpringBoot的Web开发过程中,我们很多时候经常需要重启Web服务器才能保证修改的 源代码文件、或者一些诸如xml的配置文件、以及一些静态文件生效,这样耗时又低效。所谓的热部署指的...

CodeSheep ⋅ 25分钟前 ⋅ 0

OSChina 周六乱弹 —— 假如你被熊困到树上

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》 《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》- 谢...

小小编辑 ⋅ 56分钟前 ⋅ 5

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 今天 ⋅ 1

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部