做了将近一个月的IOS开发,才刚搞清楚实例变量是怎么回事,汗。。。本来都是照着sample随便写的,反正能用,直到这几天看了《ios7 programming fundamentals》,才真正弄明白,本文记录一下:
没有类变量
objective-c中类定义包括interface块和implementation块,通常情况下,前者放在.h文件,后者放在.m文件。不过这不是必须的,全部写在一个文件里也没有问题,但是分开是推荐做法,也方便其他类import
与java不同,objective-c中没有类变量的说法,只有实例变量。在java里,类变量经常被当做常量来使用:
public static String URL = "http://www.xxx.com";
在objective-c里,类似的需求可以用define来实现:
#define URL @"http://www.xxx.com"
但是,这并不是类变量,objective-c里只有实例变量
实例变量的标准写法
实例变量声明放在implementation段里,所有方法的前面,一般用{}包起来,比如:
@implementation YLSBackupDelegate
{
NSString *userName;
}
类似于java中的
private String userName;
此时userName变量无法被外部访问,就跟java中的private字段一样,这也符合OO私有变量隐藏的思想。如果希望这个字段暴露出去,就需要为这个字段写access方法:
-(NSString*) userName;
-(void) setUserName:(NSString*)name;
并且定义到interface段里。这个写法也跟java中类似:
public String getUserName(){
return userName;
}
public void setUserName(String name){
this.userName = name;
}
注意这里有一个重要的区别,objective-c中的getter方法,方法名就是实例变量的名字,而在java bean里,getter method的方法名是getXXX
@property语法糖
当实例变量(字段)很多时,为每个实例变量写access方法是非常麻烦的事(曾经试过在java里为一个model类的50个字段写getter和setter,当时我还不熟悉eclipse)。在java中,没有办法在语法层面减轻这个工作量,但是IDE提供了自动生成access方法的功能
而在objective-c里,则在语言层面提供了语法糖,@property。不过这块糖随着版本变迁,也有几次细微的调整,所以网上搜到的帖子说法也都不太一样,最新的情况似乎是这样的:
@property写在interface段里
@interface YLSMainViewController : CDVViewController
@property YLSBackupDelegate *backupDelegate;
@property YLSResumeDelegate *resumeDelegate;
@end
这很合理,因为既然要将实例变量暴露出去,那么即使不用@property,access方法本来也要声明在interface里
不需要@synthesize语句
在某个版本之前,对应@property,在implementation中需要写对应的@synthesize语句,来合成access方法,不过在一次升级之后,现在已经不再需要了
不需要重复声明实例变量
实际上,@property声明的是属性,并不是实例变量。但是编译器会根据属性,自动生成实例变量,和对应的access方法。所以已经在interface里声明了@property,就不再需要在implementation里再声明实例变量了。如果重复声明,似乎还会报错,有时候引入一些比较老的第三方组件,比如ASIHTTPRequest,还会编译不通过
访问属性
访问属性也有语法糖,即.操作符。如果不使用@property,通过access方法访问实例变量,需要用标准的调用方法操作符[]:
[xxx userName];
[xxx setUserName:@"abc"];
但是如果用了@property,就可以使用.操作符来存取:
xxx.userName = "abc";
NSString *name = xxx.userName;
自动生成的实例变量命名规则
要记住,属性不是实例变量,而是根据属性会生成实例变量(和对应的access方法)。所以,属性名叫name,而实例变量的名字并不是name。在我这个环境ios7+xcode5,命名规则似乎是在属性前面加上_
比如
@property NSString* name;
生成的实例变量名将是_name
所以要访问这个实例变量,就有2种方法,或者使用.操作符
NSString *n = self.name;
这等价于:
NSString *n = [self name]
或者,直接使用实例变量名:
NSString *n = _name;
但是,由于文档中并没有明确说明这个命名规则,所以后者类似于潜规则。如果版本升级后,命名规则改变了,代码就需要重新编译。因此,使用.操作符,是更保险的做法。命名规则,只要知道就可以了
分享到:
相关推荐
这儿的运行时系统扮演的角色类似于Objective-C语言的操作系统,Objective-C基于该系统来工作。本文档将具体介绍NSObject类以及Objective-C程序是如何和运行时系统交互的。特别地,本文档还给出来怎样在运行时动态地加
Objective-C语言的许多决策可以在编译和运行时执行。只要有可能,它是动态的。这意味着Objective-C语言不仅需要一个编译器,还需要一个运行时系统来执行编译的代码。Runtime系统是一种用于Objective-C语言的操作系统...
《objective-c程序设计》通过大量的实例系统地介绍了objective-c语言的基本概念、语法规则、框架、类库及开发环境。读者在阅读《objective-c程序设计》后,可以掌握objective-c语言的基本内容,并进行实际的iphone/...
希望这个简单的Objective-C语言教程能够为你提供一个入门的起点。Objective-C是一种面向对象的编程语言,广泛应用于Mac OS和iOS开发。通过学习Objective-C的基本语法、类和...祝你在学习Objective-C的过程中取得成功!
附录中还介绍了如何从其他语言过渡到Objective-C。 本书适合各类开发人员阅读。 内容截图 目录: 第1章 启程.1 1.1 预备知识1 1.2 历史背景1 1.3 内容简介2 1.4 小结3 第2章 对C的扩展4 2.1 最简单的...
《Objective-C 程序设计(第4版)》已经为iOS 5和Xcode4.2中的重大变更做了全面更新,最大的改动是引入了自动引用计数(ARC),并详细说明了如何在Objective-C编程过程中使用ARC提升和简化内存管理。
用Objective-C语言实现了各种设计模式,收集各种例子,方便大家学习和普及设计模式。.zip用Objective-C语言实现了各种设计模式,收集各种例子,方便大家学习和普及设计模式。.zip用Objective-C语言实现了各种设计...
C语言主要知识点巩固(学习Objective-C 的前提),PPT格式。
本书全面而系统地讲述Objective-C语言的基础知识和面向对象编程的重要概念,结合实例介绍了Cocoa工具包的优秀特性和其中的框架,以及继承、复合、源文件组织、内存管理、对象初始化和类别创建等众多重要的面向对象...
Objective-C 基础教程,从入门到精通 Objective-C 基础教程,从入门到精通,是你学习 Objective-C 的经典之作。
Objective-C 是一种通用、面向对象的编程语言,广泛应用于 macOS 和 iOS 等苹果平台的开发中。它是 C 语言的超集,结合了 Smalltalk 式的消息传递机制和 C++ 的特性。Objective-C 是苹果公司采用的主要编程语言之一...
在windows系统下搭建Objective-C开发环境,由于公司要做iphone开发,个人学习objc(Objective-C)语法,所以在windows7下搭建了一个objc开发环境,现把自己整理的帮助文档拿来与大家分享,希望能对大家有所帮助。...
elcome to Learn Objective- C on the Mac! This book is designed to teach you the basics of the Objective- C language. Objective- C is a superset of C and is the language used by many (if not most) ...
这是一个基于Objective-C语言的基础案例集 旨在用于给初学者快速了解Objective-C语言的语法 .zip
learn Objective-c on the mac 的配套代码!
这是一个基于Objective-C语言的基础案例集。旨在用于给初学者快速了解Objective-C语言的语法。.zip
Objective-C是扩展C的面向对象编程语言,也是iPhone开发用到的主要语言。本书结合理论知识与示例程序,全面而系统地讲述Objective-C编程...附录中还介绍了如何从其他语言过渡到Objective-C。 本书适合各类开发人员阅读