Object-c中的点语法

原创 2015年07月08日 21:54:05

最近在学oc,感觉oc中的点语法挺特别的,今天特意写一下关于点语法的一些注意事项。
oc开始是没有点语法的,后来将点语法加了进来,我想可能是帮助一些熟悉其他语言的人转入oc中来。如果学过c/c++、java等语言,我们估计都不陌生,但是,实际上oc中的点语法跟刚刚所提到的一些语言是有很大区别的。废话不多说,我们依旧写一个例子加以说明。
源文件 Person.h

//
//  Person.h
//  Lesson5
//
//  Created by Lee on 7/9/15.
//  Copyright (c) 2015 Lee. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject{
    NSString *_name;
}

-(void) setName:(NSString*)newName;
-(NSString*) name;

//@property NSString *name;

@end

源文件 Person.m

//
//  Person.m
//  Lesson5
//
//  Created by Lee on 7/9/15.
//  Copyright (c) 2015 Lee. All rights reserved.
//

#import "Person.h"

@implementation Person

-(void) setName:(NSString*)newName{
    _name = newName;
}

-(NSString*) name{
    return _name;
}

//@synthesize name;

@end

源文件 main.m

//
//  main.m
//  Lesson5
//
//  Created by Lee on 7/9/15.
//  Copyright (c) 2015 Lee. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");

        Person *person = [Person alloc];
        [person setName:@"小李"];
        NSLog(@"Name is %@ ",[person name]);

        //利用点操作字段
        person.name = @"小张";
        NSString *newName = person.name;
        NSLog(@"Name is %@ ",newName);

    }
    return 0;
}

我们首先声明一个Person类,在该类中,我们只声明了一个name字段,接着将对该字段的操作补充完整,也就是getter与setter的实现。这里需要注意一下,oc中默认的getter的名字与字段名字是一样的,所以getter也就是 -(NSSring *) name; 这样我们都知道其实不好,一会再说解决方法。
在主函数中我们创建一个该类的对象,通常我们设置字段内容的时候,我们通过[person setName:@”小李”]; 来进行操作的,这是oc的经典的操作。除了这种方案,我们是否还有其他方案来设置字段的值呢?答案是肯定的,也就是我们今天提到的点操作。
这里的点不像c/c++中的点,它不是直接操作对象中的字段的。这里的点是在编译层面上的,也就是说,在编译期间,编译器会将这个点转换成一般方法调用(经典方法的调用)。如下:

person.name=@"小李";
//点操作在编译期间实质转换成的经典的形式
[person setName:@"小李"];

NSString *name = person.name;
//点操作在编译期间实质转换成的经典的形式
NSString *name = [person name];

点操作方便了我们去操作类中的字段,oc中也添加了一些固定的形式来代替我们去写setter与getter。在声明的时候,我们可以使用@property 字段类别 字段名; 来代替getter/setter方法。如下:

//-(void) setName:(NSString*)newName;
//-(NSString*) name;

@property NSString *name;       //以上注释等同于这句

在实现的时候我们可以使用@synthesize 字段名; 来代替getter/setter内容的实现,如下:

@implementation Person

//-(void) setName:(NSString*)newName{
//    name = newName;
//}
//
//-(NSString*) name{
//    return name;
//}
//
@synthesize name;   //以上注释内容等同于这句

@end

这样我们就可以通过点操作直接去操作我们的字段了。可以看出来,oc中的点操作实际上是在使用对象中的方法,而不是像c/c++中的选择作用。这里使用的两个关键字是标准的getter/setter ,如果我们需要扩展他们,就需要我们自己去实现了。
之前提出了一个问题,就是字段名与getter名重名问题,如下:

-(NSString*) name{
    return name;
}

显然我们很不习惯这样命名,为了解决名字一致问题,我们可以这样来设置:

#import <Foundation/Foundation.h>

@interface Person : NSObject{
    NSString *_name;      //通过以下划线来解决getter名与字段名重复问题
}

-(void) setName:(NSString*)newName;
-(NSString*) name;

//@property NSString *name;

@end

@implementation Person

-(void) setName:(NSString*)newName{
    _name = newName;
}

-(NSString*) name{
    return _name;
}

//@synthesize name;

@end

我们在声明字段时通过以下滑线开头来标识字段与getter名字的不同,这样就解决了字段名与getter名一致的问题了,是不是看着很清爽呢?好了,今天就到这吧!

以下是本程序运行的结果:
这里写图片描述

IOS开发基础Object-C(03)—点语法

今天我们来介绍一下OC中的点语法,官方为了让更多的程序员更加容易的学习开发OC语言,所以增加了一个点语法。在上一篇博客中,我们详细介绍了在OC中类的创建。今天我们就来简单的复习一下:一、创建一个学生类...
  • u010037928
  • u010037928
  • 2015年10月31日 17:27
  • 2186

【Objective-C】点语法

一、 1、 在java中,我们可以通过“对象名.成员变量名”来访问对象的公共成员变量,这个就是点语法。public class Student { public int age; }...
  • haojie2014
  • haojie2014
  • 2015年07月15日 21:20
  • 688

Object-C 类的点语法

类的.h中  方法名( :号也是方法名的一部分) - (void)setAge:(int)newAge; //方法名是setAge: -(int)age; //方法名是age -(void)setAg...
  • u013252054
  • u013252054
  • 2013年12月25日 21:16
  • 724

IOS 的属性剖析(点语法操作)

在C++中,没有属性的概念,只有setter,getter的方式来对类成员变量进行操作。 如: class gloox { public:        gloox(){};       ...
  • fengsh998
  • fengsh998
  • 2013年01月27日 18:04
  • 5058

iOS开发中,关于什么时候使用点语法的解答

这个问题比较简单,我想很多朋友都知道的一清二楚,当然也会有很多朋友知道一点点(以初学者为主)。当初学iOS的时候全篇点语法,后来看到说点语法要经过方法派发,比较慢,直接访问实例变量比较快,于是又全篇直...
  • u013046795
  • u013046795
  • 2015年07月19日 18:46
  • 636

字典和点语法

一,字典 1,【说明】字典数组不同,字典没有下标没有顺序 1),字典是oc中特有的类型,用于存放oc的对象。 2),字典中存放的对象是没有顺序的。 3),字典中...
  • GodBlessMyParents
  • GodBlessMyParents
  • 2015年08月07日 16:27
  • 706

OC学习那些事:点语法

1.使用自定义的方法创建get/set方法  Person.h文件:  #import @interface Person : NSObject { int age; } ...
  • p106786860
  • p106786860
  • 2013年07月20日 09:41
  • 3314

OC点语法和箭头的区别

OC点语法和箭头的区别
  • Ashimar_a
  • Ashimar_a
  • 2016年06月06日 13:43
  • 447

Object-c学习之路(oc点语法)

最近想学习object-c了自己上网找了一些资料自学了一下:oc中的点语法是为了java、c等的程序员更好的上手而添加的功能。 主函数 // // main.m // OcTest1 // // ...
  • superlele123
  • superlele123
  • 2013年07月23日 11:07
  • 1530

Object-C学习 属性、点语法练习

因为要熟悉内存管理, 所以练习是在MRC环境下实现的
  • liquanquan2014
  • liquanquan2014
  • 2014年09月18日 08:49
  • 588
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Object-c中的点语法
举报原因:
原因补充:

(最多只允许输入30个字)