OC第四节 ——点语法和@property

一、setter和getter函数
    1.回忆:如何访问对象中的成员变量
    2.setter和getter函数的作用
            setter  方法:   修改对象的字段/实例变量
            getter 方法:   读取对象的字段/实例变量
            
            setter 方法: 可以带有多个参数,可以同时给多个变量赋值

getter方法: 不带参数,只能返回一个变量的值。

3.setter和getter如何命名
                
    setter 方法的命名:

xxxx: 表示的是成员变量的名字

//带有一个参数
            - (void)setXxxx:(参数类型)参数1;
            //带有多个参数
            - (void)setXxxx:(参数类型)xxxx andXxxx:(参数类型)xxxx......;

getter 方法的命名:
            - (返回值类型)xxxx;

=======================================
二、点语法
    1.为什么要设计点语法
        为了方便别的程序员转到OC上面来,   C ++, jave ,c#  都是使用的点语法        为了让程序设计简单化
        隐藏了内存管理细节
        隐藏了多线程、同步、枷锁细节

2.点语法的作用
        属性可以在不适用括号的情况下使用点语法
        无需调用[foo value] 可以调用foo.value 来访问. 注意跟结构体的区别
        虽然foo.value 看起来像是直接访问value变量,但是属性始终调用
        方法,而这些方法又可以访问对象的数据。

3.点语法的调用
        xiaohong.name = @“xiaohong”;这里实际上调用的是setter方法。
        NSString *nameString = xiaohong.name; 这里实际上调用的是getter方法。

4.点语法和setter/getter函数的关系
        @interface QFDog: NSObject
        {
            NSInteger _age;
        }
        - (void)setAge:(NSInteger)newAge;
        - (NSInteger)age;
        @end

@implementation QFDog
        - (void)setAge:(NSInteger)newAge
        {
                _age = newAge;
        }
        - (NSInteger)age
        {
                return _age;
        }
        @end

int main(void)
        {
                QFDog *dog = [[QFDog alloc] init];
                [dog setAge:10];
                NSInteger dogAge  = [dog age];

dog.age = 20;
                NSInteger dogAge1 = dog.age;

return 0;
        }

【注】
         【点语法和[]写法】
            本质一样,同样是发送set和get消息,只不过写法不同。
         
         点语法:
            对象指针.实例变量;
         
            如果是赋值
                    对象指针.实例变量 = xxxx;
            展开成: [对象指针 setXxxx: xxxx];
         
            
            如果是取值:
                    xxxx = 对象指针.实例变量;
            展开成: [对象指针 实例变量];

dog.name = @“xiaobai”;
    展开成: [dog setName: @“xiaobai”];

NSString *nameString = dog.name;
    展开成: NSString *nameString = [dog  name];
         
         能够使用点语法的条件:
            1、必须实现set和get方法
            2、只能用于实例化的变量的赋值和取值
            3、能使用点语法的赋值,对应的set方法只能够带有一个参数

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    NSString *_name;
    NSInteger _age;
    NSString *_identical;
}
- (void)setName:(NSString *)name;
- (NSString *)name;

- (void)setAge:(NSInteger)age;
- (NSInteger)age;

- (void)setIdentical:(NSString *)identical;
- (NSString *)identical;
@end

#import "Person.h"

@implementation Person
- (void)setName:(NSString *)name
{
    _name = name;
}
- (NSString *)name
{
    return _name;
}
- (void)setAge:(NSInteger)age
{
    _age = age;
}
- (NSInteger)age
{
    return _age;
}

- (void)setIdentical:(NSString *)identical
{
    _identical = identical;
}
- (NSString *)identical
{
    return _identical;
}
@end

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

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        Person *p = [[Person alloc] init];
        p.name = @"李平";
        //[p setName:(NSString *)]
        NSString *nameStirng = p.name;
        //NSString *nameStirng = [p name];
        NSLog(@"name: %@", nameStirng);

        p.age = 10;
        p.identical = @"12345678";

        NSLog(@"age: %ld", p.age);
        NSLog(@"identical: %@", p.identical);

    }
    return 0;
}

property

#import <Foundation/Foundation.h>

@interface MyPoint : NSObject
{
    NSInteger _x;
    NSInteger _y;
    NSInteger _z;
    NSString *_name;
}
@property NSInteger x, y, z;
//    NSInteger _x;
//    NSInteger _y;
//    NSInteger _z;

//展开成为下面的两行
//- (void)setX:(NSInteger)x;
//- (NSInteger)x;

//@property NSInteger y;
//- (void)setY:(NSInteger)y;
//- (NSInteger)y;

//@property NSInteger z;
//- (void)setZ:(NSInteger)z;
//- (NSInteger)z;

@property NSString *name;
//- (void)setName:(NSString *)name;
//- (NSString *)name;

- (void)test;

@end

#import "MyPoint.h"

@implementation MyPoint
//@synthesize x;  //首先会去实例变量列表查找x, 如果没有x, 生成x
@synthesize x = _x; //和成员列表的_x 进行关联
@synthesize y = _y;

- (void)test
{
//    NSLog(@"x = %ld", x);
    NSLog(@"_x = %ld", _x);
    NSLog(@"_y = %ld", _y);

}

//- (void)setX:(NSInteger)x
//{
//    _x = x;
//}
//
//
//- (NSInteger)x
//{
//    return _x;
//}

//如果自己实现了set和get方法,那么@synthesize就不会展开
//- (void)setY:(NSInteger)y
//{
//    NSLog(@"------------");
//    _y = y;
//}
//- (NSInteger)y
//{
//    return _y;
//}
//
//
//
//- (void)setZ:(NSInteger)z
//{
//    _z = z;
//}
//- (NSInteger)z
//{
//    return _z;
//}
//
//- (void)setName:(NSString *)name
//{
//    _name = name;
//}
//- (NSString *)name
//{
//    return _name;
//}
@end

#import <Foundation/Foundation.h>
#import "MyPoint.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {

        MyPoint *point = [[MyPoint alloc] init];

        point.x = 10;
        point.y = 100;

        [point test];
        NSLog(@"x : %ld, y: %ld", point.x, point.y);

    }

    return 0;
}
时间: 2024-10-20 12:28:04

OC第四节 ——点语法和@property的相关文章

OC第四节——NSDictionary和NSMutableDictionary

NSDictionary    1.什么是字典        字典是也是一种集合结构,功能与我们现实中的字典工具一样    2.字典的元素是什么        任意类型的对象地址构成键值对    3.什么是键值对        键值对是由key和value构成必须一一对应        键值对中的key必须保证是唯一的        4.字典的存储方式       字典是一种无序保存的集合    5.如何查找值        根据键值对中的key找到相应的值 ==================

【非凡程序员】 OC第四节课 (复合和多态)

1.复合:是将各个部分组合在一起.程序设计中就是用已有类的对象来产生新的类.编程中的复合就是将多个组件组合在一起,配合使用,从而得到完整的作品.发动机是汽车的组成部分 -> 复合飞轮是发动机的组成部分 -> 复合汽油发动机是发动机 -> 继承(可以理解为复合就是组成部分,而继承是类的一种属于关系.) 2.多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果.在运行时,可以通过指向基类的指针,来调用实现派生类中的方法.多态是面向对象的重要特性,简单点说:"一个接口

OC基础教程之基本语法

第一节总括 这一节是对Objective-C(以后简称OC)的简要介绍,目的是使读者对OC有一个概括的认识. 1.面象的读者 在阅读本文之前,应具备使用与C类似的编程语言(如C,C++,JAVA)的一些经验,同时熟悉面向对象编程. 2.OC简介 OC是以SmallTalk为基础,建立在C语言之上,是C语言的超集.20世纪80年代早期由 Brad J.Cox设计,2007年苹果公司发布了OC 2.0,并在iPhone上使用OC进行开发. 3.OC学习内容 学习的内容主要包括语法和Cocoa框架两部

VUE2.0实现购物车和地址选配功能学习第四节

第四节 v-on实现金额动态计算 用¥金额 进行格式处理,可以使用原生js进行转换,但是在vuei,使用filter过滤器更加方便 注: 1.es6语法=>和import等 好处在于res参数后的function函数内的this作用域,不弄在外部声明变量了. methods:{ cartView:function(){ let _this=this; this.$http.get("data/cartData.json",{"id":123}).then( r

delphi 线程教学第四节:多线程类的改进

第四节:多线程类的改进 1.需要改进的地方 a) 让线程类结束时不自动释放,以便符合 delphi 的用法.即 FreeOnTerminate:=false; b) 改造 Create 的参数,让它适合访问 COM 组件.如:在线程时空中能够创建 TAdoConnection; c) 设计一个接口能将一个过程( procedure )塞到线程时空中去运行的功能,这样,不必每次重载 Execute 函数. d) 设计一个输出信息的接口 下一节,将讲解如何用多个线程同时执行相同的任务 改进后的多线程

centos LNMP第二部分nginx、php配置 第二十四节课

centos  LNMP第二部分nginx.php配置  第二十四节课 上半节课 下半节课 f

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字段的类型以及相关属性elasticsearch会根据json源数据的基础类型猜测你想要的字段映射,将输入的数据转换成可搜索的索引项,mapping就是我们自己定义的字段数据类型,同时告诉elasticsearch如何索引数据以及是否可以被搜索 作用:会让索引建立的更加细致和完善 类型:静态映射和动态

centos 监控cacti/nagios/zabbix 第三十四节课

centos   监控cacti/nagios/zabbix   第三十四节课 上半节课 下半节课 f

centos 目录文件管理 第四节课

centos 目录文件管理  第四节课 上半节课 下半节课 mkdir   -p 创建多个目录mkdir  12  34  56 创建多个目录 mkdir  12  34  56 /bin/rm :直接跳过alias,直接执行rm,不提示 touch :若文件存在,更改文件的三个time rm -rf 误删文件用extundelete,不要再写,inode和文件名还在 1.安装依赖包 yum install -y e2fsprogs* 2.下载并安装extundelete