内容概述:

本文主要讲述了ios中多种声明变量方式的区别与联系,以及@interface声明的成员变量与@property属性的差异。最后介绍了推荐的声明方式。

atany原创,转载请注明博主与博文链接,3Q,未经博主允许,不得进行商业用途

http://blog.csdn.net/yang8456211/article/details/11490119

—— by atany

一、@interface与 @property的区别

前言:

1)@interface大括号中声明的是“成员变量”;

2)@property声明的是“属性”,
@synthesize与@property配对,意义是“合成”。

成员变量与属性的区别主要分为以下两点:

1、在@interface中定义变量的话,为当前类的私有(private),顾名思义,这些变量只能在当前类中被访问;而用@property声明的变量为公有(public),可以在当前类或者其他类中被访问。

2、使用@interface声明的变量,使用变量名进行访问;@property声明的变量用“
_变量名”(不用@synthesize的方式,后面会提及),或者“self.变量名”的形式进行访问。

 

二、多种变量声明方式

让我们看看下面的几种变量声明、以及调用方式:

1)在@interface中声明ivar(实例变量),即成员变量,上文已经提及过,这种方式声明的变量是私有的。

声明:在此声明一个NSString的变量atany。

@interface MethodOne : NSObject{
NSString *atany;
}

调用:在.m文件中直接使用变量名调用即可。

NSLog(@"hello %@",atany);

2)不在.h中声明变量,而直接在.m的@implementation中声明变量。

声明

@implementation MethodOne{
NSString *atany;
}

调用:这种声明方式与1)大同小异,使用上也相同,区别只是在interface中声明了之后,在implementation中不能申明同名变量。

NSLog(@"hello %@",atany);

3)只在.h中使用@property声明一个变量。

声明:

@property (nonatomic, retain) NSString *atany;

调用:不在.m文件中用@synthesize合成变量的话,系统会调用Autosynthesize自动生成一个以下划线+变量名为名称的实例变量。

调用方式除了可以用self.atany这种形式,_atany也可以。

NSLog(@"hello %@",self.atany);
NSLog(@"hello %@",_atany);

4)在.h中用@property;在.m中使用@synthesize+
变量的形式合成变量。

声明

@property (nonatomic, retain) NSString *atany;
@synthesize atany;

调用:如果使用@synthesize合成,则不会自动生成实例变量_atany,而是atany。

NSLog(@"hello %@",self.atany);
NSLog(@"hello %@",atany);

5)在.h中用@property;在.m中使用@synthesize
变量 = _变量的形式。

声明

@property (nonatomic, retain) NSString *atany;
@synthesize atany = _atany;

调用:使用@synthesize 变量 = _变量的话,真正的实例变量是_atany

NSLog(@"hello %@",self.atany);
NSLog(@"hello %@",_atany);

注:对比4)与5)两种方式,是不是很奇怪怎么有时候是atany有时候是_atany?

其实简单来说@synthesize就是声明getter、setter方法。

那么如4)这种方式。@synthesize atany 对应着getter方法为:

 -(int)atany
{
return atany;
}

而5)话@synthesize atany = _atany则是:

 -(int)atany
{
return _atany;
}

atany实际上是方法名,_atany才是实例变量,那么为什么oc不像java那样有getAtany的形式呢?

原因是在Object-C里的accessor(存取方法)中,不会用getAtany这种形式,因为Get这个词在Cocoa中有着特殊的含义。如果get出现在方法名称中,则代表了这个方法传递的参数会作为指针类型处理。如果乱用Get的话,也会出现一些Bug。

三、常用声明方式与推荐声明方式

在网上你会经常见到这种

@interface MethodOne : NSObject{
NSString *atany;
}
@property (nonatomic, retain) NSString *atany;

这不是重复声明吗?我们看看下面两种情况:

1)在.m中使用@synthesize atany(等同于不写@synthesize情况)

atany = @"atany 1";
NSLog(@"hello %@",self.atany);
NSLog(@"hello %@",atany);

我们知道self的形式是调用getter方法,atany是直接访问变量,那么赋值atany为atany 1,看输出:

2013-09-09 16:39:05.422TestVar[11376:c07] hello atany 1

2013-09-09 16:39:05.422 TestVar[11376:c07] hello atany 1

说明两者相同,也就是说@interface中的声明是多余的。

2)在.m中使用@synthesize atany = _atany。

atany = @"atany 1";
_atany = @"atany 2";
NSLog(@"hello %@",self.atany);
NSLog(@"hello %@",_atany);
NSLog(@"hello %@",atany);

输出为:

2013-09-09 16:36:28.356TestVar[11347:c07] hello atany 2

2013-09-09 16:36:28.356TestVar[11347:c07] hello atany 2

2013-09-09 16:36:28.356TestVar[11347:c07] hello atany 1

实际上atany与_atany已经是不同的两个实例变量了。

如上面描述而言:

建议是:

1.如果只是单纯的private变量,那么写在interface中与声明在implementation里都可以。

2.如果是public属性,就用property写在.h文件里,在.m文件中使用@synthesize atany = _atany; 比较好。

iOS声明变量详解的更多相关文章

  1. 转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )

    原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎 因为最近项目上要用有关LBS的功能.于是我便做一下预研. 一般说来LBS功能一般分为两块:一块是地理 ...

  2. iOS开发——Block详解

    iOS开发--Block详解 1. Block是什么 代码块 匿名函数 闭包--能够读取其他函数内部变量的函数 函数变量 实现基于指针和函数指针 实现回调的机制 Block是一个非常有特色的语法,它可 ...

  3. iOS开发:详解Objective-C runTime

    Objective-C总Runtime的那点事儿(一)消息机制 最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎 ...

  4. iOS应用开发详解

    <iOS应用开发详解> 基本信息 作者: 郭宏志    出版社:电子工业出版社 ISBN:9787121207075 上架时间:2013-6-28 出版日期:2013 年7月 开本:16开 ...

  5. iOS开发-Runtime详解

    iOS开发-Runtime详解 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [recei ...

  6. mysql show variables系统变量详解

    mysql系统变量详解 mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操作. 服务器启动时,将所有全局变量初始化为默认值.可以在选项文件或命令行中指定的选 ...

  7. Java面向对象之各种变量详解

    在Java中一定有很多变量让大家头疼,成员变量.类变量.局部变量等等,今天就来分别认识认识他们吧! Java面向对象之各种变量详解 前言 在 Java语言中, 根据定义变量位置的不同,可以将变量分成两 ...

  8. iOS中-Qutarz2D详解及使用

    在iOS中Qutarz2D 详解及使用 (一)初识 介绍 Quartz 2D是二维绘图引擎. 能完成的工作有: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成 ...

  9. iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)

    前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...

随机推荐

  1. TCO 2015 2D

    250分题:给一段仅仅有'0','1'构成的字符串,然后给出串上平衡点的定义:在串上找到某个点(位置是p),这个点将串分成左右两部分(能够为空),左右分别计算字符的值的和,假设左边有字符是'1',那么 ...

  2. 道里云SDN云网络技术:使云能够“众筹”

     容器云来了! 容器云的网络规模将比虚拟机云的情况扩大10-100倍,容器云与虚拟机云互联需求也将使云网络管控复杂度成数倍增长.SDN业界迎来了空前挑战.本报告分享道里云公司SDN技术:怎样将云的 ...

  3. 转:Java修改Excel单元格的数据及格式

    https://blog.csdn.net/aking21alinjuju/article/details/6001153?locationNum=2 继前两节的Java读取.写入Excel后,本期将 ...

  4. Java基础之关键字

    一.Java关键字总览 基本数据类型(9):boolean.char.byte.short.int.long.float.double.null 变量引用(2):super.this 类.方法.变量修 ...

  5. Markdown标记语言

    Markdown 是一种轻量级标记语言,创始人为约翰·格鲁伯(John Gruber).它允许人们“使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档”.这种语言吸收了很 ...

  6. ​Java面向对象的概念整理

    Java中一切皆是对象! 注意:8种基本数据类型不支持面向对象的编程机制,基本数据类型的数据也不具备“对象”的特性:没有成员变量.方法可以被调用. 为解决8种基本数据类型不能当成Object类型(所有 ...

  7. win10下CorelDRAW菜单栏字体变成白色了怎么办?

    相信很多同学安装了win10系统之后,你的 CDR 菜单栏就变了,变得没有任何内容,以白色显示,win10系统与CorelDRAW早期的版本兼容方面存在问题,(CorelDRAW x7/X8无此问题出 ...

  8. TF基础3

    批标准化 批标准化(batch normalization,BN)是为了克服神经网络层数加深导致难以训练而诞生的.深度神经网络随着深度加深,收敛会越来越慢,会导致梯度弥散问题(vanishing gr ...

  9. sklearn学习6----交叉验证

    1.kfold:自己分样本来交叉验证迭代 导入模块:from sklearn.model_selection import KFold 参数: KFold(n_splits=3, shuffle=Fa ...

  10. gcp – 源于CP的高级命令行文件拷贝工具

    作者:linux 出处:http://linux.cn/thread/11868/1/1/ gcp – 源于CP的高级命令行文件拷贝工具 几周前,我们讨论了高级拷贝(修改于cp命令,让其可以显示复制进 ...