新用户注册 | 会员登录
登录 极速注册
取消
热门标签 | HotTags
当前位置:   开发笔记 > 编程语言 > 正文

OC核心语法之NSString、点语法、成员变量作用域、@property和@synthesize

上一章我们主要学习了OC类和对象以及三大特性,对OC有了一定初步的认识和了解,本章主要进一步学习OC在实际开发中的开发技巧和核心语法。第一讲NSString和多文件开发的文

 

    上一章我们主要学习了OC类和对象以及三大特性,对OC有了一定初步的认识和了解,本章主要进一步学习OC在实际开发中的开发技巧和核心语法。

第一讲     NSString和多文件开发的文件分工

1. NSString

在OC中NSString用来创建字符串,如NSString *str = @"jack";

 

最简单的创建字符串的方式

  NSString *str = @"itcast";

  char *name = "jack";

  NSLog(@"我在%@上课", str);

注意OC字符串的输出用%@

创建OC字符串的另一种方式:

#import 
int main() { int age = 32; int no = 5; NSString *name = @"jack"; int size = [name length]; // length方法算的是字的个数(字数) // 创建OC字符串的另一种方式:将字符串跟int数据合成一个新的字符串stringWithFormat方法
     NSString *newStr = [NSString stringWithFormat:@"My age is %d and no is %d and name is %@", age, no, name]; return 0; }

 

如代码中,创建OC字符串的另一种方式:将字符串跟int数据合成一个新的字符串stringWithFormat方法,注意stringWithFormat:这个方法的使用。

2. 多文件开发的文件分工

在实际的项目开发过程中,一个大型项目需要多人来共同完成,这样往往要进行文件的分工。

在学习老师的点和圆的练习视频后总结了多文件开发的文件分工的结论以及注意点:

(1)不管是include还是import里面不能放.m或者.c文件,只能放.h文件,.h 文件里面写函数声明

(2)只有利用类名调用类方法的时候,不需要在类名的后面写*。其他情况下,类名后面统一加上一个*

         Circle *c1 = [Circle new];

         - (BOOL)isInteractWithOther:(Circle *)other

(3)返回值是BOOL类型的,涉及到“是否XXX”,方法名一般都以is开头

         - (BOOL)isInteractWithOther:(Circle *)other 

(4)想拥有某个对象,就先创建对象,然后调用set方法将对象传递给内部的成员变量

  // 创建圆心对象
  Point2D *p1 = [Point2D new];
  [p1 setX:13 andY:15];
  // 先设置圆心
  [c1 setPoint:p1];

(5)定义一个分2个文件:.h声明文件,和.m实现文件

  .h:成员变量,方法的声明
  .m:方法的实现

(6)如果想使用某一个类,只需要#import类的.h文件即可

第二讲     点语法和成员变量作用域

一、 点语法

1. 点语法的作用

OC设计点语法的目的,是为了让其他语言的开发者可以很快的上手OC语言开发,使用点语法,让它和其他面向对象的语言如java很像。

2. 点语法的本质

点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法。

切记点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语法。

如:

stu.age=10;展开为:[stu setAge:10];  // 本质是set方法

int  a=stu.age;展开为:[stu age];  // 本质是get方法

编译器如何知道是set方法还是get方法?主要是看是否赋值(可以使用断点调试来查看)。

在OC中访问成员变量只有一种方式即使用-> 如stu->age,这种情况要求在@public的前提下。

3. 点语法的使用注意

下面的使用方式是一个死循环:

(1)在set方法中,self.age=age;相当于是[self setAge:age];

(2)在get方法中,return self.age;相当于是[self age];

二、 成员变量的作用域

@public:在任何地方都能直接访问对象的成员变量

@private:只能在当前类的对象方法中直接访问   (@implementation中定义成员变量默认是@private,但一般很少这么做)

@protected:可以在当前类及其子类的对象方法中直接访问  (@interface中定义成员变量默认是@protected)

@package:只要处在同一个框架中,就能直接访问对象的成员变量   (这个不太常用)

注意:@interface和@implementation中不能声明同名的成员变量

@public在之前的学习初步阶段老师在成员变量之前都会加上是为了方便初学者,但随着学习的深入@public会暴露代码的内部结构因此除非特殊的情况不建议这么做。

@private只能在当前类的对象方法中直接访问,这句话指的是如果当前类@interface中声明的成员变量是@private类型,那么只能在当前类的@implementation中直接访问,在其子类或者其他地方都不能直接访问。

@protected在@interface中定义成员变量默认是@protected,可以在当前类及其子类的对象方法中直接访问,在其当前类和子类的@implementation的对象方法中可以直接访问。

第三讲     @property和@synthesize

     @property和@synthesize这两个关键字是编译器特性,让xcode可以自动生成getter和setter的声明和实现。

1. @property关键字

@property 关键字可以自动生成某个成员变量的setter和getter方法的声明

比如:

@property int age;

编译时遇到这一行,则自动扩展成下面两句:

- (void)setAge:(int)age;

- (int)age;

注意:@property是用在@interface中,用来自动生成setter和getter的声明,用@property int age; 就可以代替上面的两行

2. @synthesize关键字

@synthesize关键字可以帮助生成成员变量的setter和getter方法的实现。

语法:@synthesize age = _age;

相当于下面的代码:

- (void)setAge:(int)age

{

  _age = age;

}

- (int)age

{

  return  _age;

}

注意:@synthesize关键字用在@implementation中,用来自动生成setter和getter的实现,用@synthesize age = _age;就可以代替上面的代码。

3. @synthesize关键字使用细节

*@synthesize age = _age;

  setter和getter实现中会访问成员变量_age

  如果成员变量_age不存在,就会自动生成一个@private的成员变量_age

*@synthesize age;

  setter和getter实现中会访问成员变量age

  如果成员变量age不存在,就会自动生成一个@private的成员变量age

*手动实现

  若手动实现了setter方法,编译器就只会自动生成getter方法和不存在的成员变量

  若手动实现了getter方法,编译器就只会自动生成setter方法和不存在的成员变量

  若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量

注意:@synthesize age = _age;这句代码@synthesize会访问_age这个成员变量,如果不存在,就会自动生成@private类型的_age变量,相当于在@implementation中生成成员变量

#import "Car.h"
@implementation Car //会访问_speed这个成员变量,如果不存在,就会自动生成@private类型的_speed变量,相当于在@implementation中生成成员变量
@synthesize speed = _speed; @synthesize wheels = _wheels; // 下面这样同时写也是可以的 //@synthesize speed = _speed, wheels = _wheels;

- (void)test { NSLog(@"速度=%d", _speed); } @end

 

可以在main函数中利用断点调试和点语法来验证是否生成了成员变量以及是否生成了setter和getter方法

#import 
#import "Car.h"
int main(int argc, const char * argv[]) { @autoreleasepool { Car *c = [Car new]; c.speed = 100;  // 可以利用断点,查看到会自动生成了_speed的成员变量
 [c test]; } return 0; }

 

4. @property新特性

  自从Xcode4.4后,@property就独揽了@synthesize的功能,也就是说,@property可以同时生成setter和getter的声明和实现

  默认情况下,setter和getter方法中的实现,会去访问下划线_ 开头的成员变量。

  也就是说@property int age;这句话完成了3个功能:

  (1)生成_age成员变量的get和set方法的声明;

  (2)生成_age成员变量set和get方法的实现;

  (3)生成一个_age的成员变量。

5. id关键字

id是万能指针,能指向或者说操作任何OC对象 

注意:id后面不要加上 *

id是一种类型,变量名不能叫id,可以叫_id或者ID

id d = [Person new];  // id == NSObject *  学习时可以把id相当于NSObject *,因此任何继承于NSObject的都能操作

id的两种巧妙运用:

(1)void test(id d)  // id作为函数参数时表示任何对象都能作为函数参数传进来

  {  

  }

(2)@property id obj; // 这么写时表示成员变量是id类型,任何对象都能作属性,包括字符串

 

本章学习总结:

  Xcode真的是一款非常强大的软件,苹果官方为其开发者设计的相应开发软件给开发者带来了很大的便利,让开发者能够不必花太多时间在垃圾代码上,就拿本章学习的知识来说,成员变量的getter和setter方法的声明跟实现可以说默写都能写出来,但是在实际应用开发中往往有很多的成员变量,setter和getter方法又不得不写,如果一行一行去写这种没有任何技术含量的代码势必要浪费很多时间在这种无聊的代码上,因此苹果官方利用@property和@synthesize来很好的解决了这一问题,给开发者带来了很大的便利。而且在Xcode4.4之后,做了更加的升级,@property就能独揽之前@synthesize的功能,让变成代码更为精简。

  本章主要分为三讲知识,第一讲主要学习了NSString和多文件开发的文件分工,要掌握创建字符串的几种方式,还有NSString的一个很好用的方法stringWithFormat。另外,多文件开发的文件分工本章主要是做了一个总结,没有举实际的例子,例子要参照视频中点和圆的练习,需要掌握.m和.h文件的分工内容,同时要掌握BOOL类型的命名规范和创建对象时的注意事项。本章第二讲主要讲述点语法和成员变量的作用域,要掌握点语法的本质就是set和get方法,要注意和避免点语法中的死循环问题。成员变量的作用域问题要掌握那几个关键字的含义,特别是@private和@protected这两个,要掌握成员变量在什么情况下能够访问和什么情况下不能访问。本章第三讲主要学习了@property和@synthesize两个关键字,这两个关键字是编译器特性,让Xcode可以自动生成setter和getter方法的声明跟实现,照目前版本@property比较常用,因为其包括了@synthesize的功能,但是也要了解和掌握@synthesize的功能,注意@synthesize实际上就是帮助生成了setter和getter方法的实现,而@property则是可以同时生成setter和getter的声明和实现。要注意两个关键字的一些使用细节问题。此外本章还学习了万能指针id,能够操作任何OC对象,要掌握id在一些特定情况下的巧妙使用。


  • string
  • 文件
  • cas
  • char
  • import
  • io
  • int
  • main
  • format
推荐阅读
  • case

    开发笔记:实验7的文件读写操作

    开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • command

    使用C语言命令行参数在Windows上启动程序并传递参数

    本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • string

    GTK+浅谈之十五GObject面向对象的继承

    本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • string

    C语言自带的快排和二分查找

    C语言自带的快排和二分查找
    Author🚹:CofCaiEmail✉️:cai.dongjunnexuslink.cnQQ😙:1664866311personalPage&#x ... [详细]
  • get

    在手机上怎么运行c语言,各位前辈这两个程序怎么在手机上运行

    该楼层疑似违规已被系统折叠隐藏此楼查看此楼*madebyebhrz*#include#include#include#include#include#include#include ... [详细]
  • string

    C语言的经典程序有哪些

    C语言的经典程序有哪些
    本篇内容介绍了“C语言的经典程序有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何 ... [详细]
  • java

    VScode格式化文档换行或不换行的设置方法

    VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • string

    向QTextEdit拖放文件的方法及实现步骤

    向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • get

    Linux环境变量函数getenv、putenv、setenv和unsetenv详解

    Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • dll

    PE总结9PE文件结构之 解析导出表

    本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • string

    C++字符字符串处理及字符集编码方案

    C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • get

    深入浅出Linux设备驱动编程的重要性与方法

    本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • java

    OpenMap教程4 – 图层概述

    OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • case

    Python正则表达式学习记录及常用方法

    Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • java

    在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法

    在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
author-avatar
天天写程序
这个家伙很懒,什么也没留下!
Tags | 热门标签
  • integer
  • header
  • join
  • byte
  • timestamp
  • bash
  • get
  • less
  • command
  • shell
  • uml
  • iostream
  • input
  • post
  • loops
  • solr
  • bitmap
  • php
  • dll
  • python2
  • jar
  • blob
  • timezone
  • string
  • hook
  • range
  • case
  • java
  • md5
  • erlang
RankList | 热门文章
  • 1 Linux基础教程学习笔记32——防火墙的使用与配置
  • 2 检验mysql主从备份,读写分离
  • 3 vuex(篇1)——state
  • 4 脉冲|电压_基于RoboMasterC型开发板的RTThread使用分享
  • 5 SeeMusic | 栏目上线!和我们一起看见 Web3 音乐世界!
  • 6 osgi学习之路(2)- OSGi开发环境的建立
  • 7 HeadFirst设计模式(二) 观察者模式
  • 8 关于如下2个矩阵为何是相似矩阵?
  • 9 I “Heard” the Love
  • 10 《听琴图》是谁画的?图上的三个人分别是谁?
  • 11 VirtualBox6.0中CentOS7.6 网络配置
  • 12 PHPCMS移植到PHP7MySQL8_phpcms v9 整合 phpwind 8.7
  • 13 golang基准测试Benchmark和Jmeter压测实践
  • 14 开发笔记:iOS 11 安全区域适配
  • 15 类型不符合协议序列类型 - Swift - type does not conform to protocol Sequence Type - Swift
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 | PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有
     

深圳SEO优化公司吉林seo优化网站源码优化网站就选h火19星棒网站优化霸屏加盟费用江北城网站推广优化平谷优化网站推广网站优化效果检测怎么写大连网站推广优化公司网站优化公司联系电话韶关市网站seo优化多少钱漯河企业网站优化唐山网站优化方案郑州网站权重优化代理商海北网站seo优化google网站优化中山外贸网站优化咨询电话网站外部优化教程网站专题页面怎样进行优化设计郑州官网seo网站优化济南百度网站快速优化网站做优化戮两云速捷出众青岛网站优化有哪些宝山区百度网站优化案例建安网站优化的模式淄博济南网站优化工具分析宣城网站排名优化哪家信誉好益阳专业网站优化公司怀化网站优化哪家强邯郸网站优化推广价格seo优化网站公司天津网站优化价格咨询歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化