内容概述:

本文主要讲述了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; 比较好。

最新文章

  1. Webstorm+Webpack+echarts构建个性化定制的数据可视化图表&&两个echarts详细教程(柱状图,南丁格尔图)
  2. Mac osx 安装PIL出现Some externally hosted files were ignored (use --allow-external PIL to allow).
  3. ASP.NET中使用HttpWebRequest调用WCF
  4. 【AngularJS】—— 12 独立作用域
  5. yii2整合百度编辑器umeditor
  6. JDBC中prepareStatement 和Statement 的区别
  7. linux服务之iptables与firewalld
  8. Delphi异形窗口之PNG
  9. Linux网络编程-----Socket地址API
  10. 【Java 之 JVM】Java内存结构概述
  11. Qt 5.7 > Qt Applications
  12. Mac入门推荐(写给Mac小白)
  13. CSS3学习系列之字体
  14. ExpandableListView的使用
  15. iOS 中捕获截屏操作
  16. 爬虫模块介绍--request(发送请求模块)
  17. Alpha、伪Beta 发布个人感想与体会
  18. 迷你MVVM框架 avalonjs 0.91发布
  19. PyCharm入门教程——在编辑器中打开和重新打开文件
  20. 重构改善既有代码设计--重构手法09:Substitute Algorithm (替换算法)

热门文章

  1. [AHOI 2009] 同类分布
  2. mysql(8.0.*版本 windows10 )忘记密码解决方案
  3. 在eclipse环境下使用maven install 命令碰到native2ascii-utf8问题解决方案
  4. 日志记录~log4.net
  5. 初学C#,总结一下.sln和.csproj的区别
  6. Springboot use tomcat JNDI
  7. 博客移至 GitHub
  8. unity 模型 材质 贴图 关系;着色器属性
  9. Java学习进阶—高级编程
  10. Day 03 知识点[python程序运行的方式、变量、注释、内存管理、数据类型]