这两天同学总是问OC里.和->的用法区别,当时回答的不是很好,周末查了一下,大概清楚了,在这里记录一笔。

先看这个例程

 #import <Foundation/Foundation.h>

@interface Test : NSObject
{
int temp; //成员变量
}
@end
@implementation Test
@end int main()
{ Test *t = [[Test alloc] init];
t->temp = 100;
NSLog(@"%d",t->temp);
return 0;
}

这里

t->temp = 100;
NSLog(@"%d",t->temp);

这两行中的t->temp会提示错误,错误说明为instance varviable “temp” is protected。说明是可以访问的,但是因为受保护所以报错,那我们把权限改成public试试。

    @public
int temp; //成员变量

结果显示通过,没有错误,说明想法是对的。

接下来再看看.点语法

 #import <Foundation/Foundation.h>

@interface Test : NSObject
{
int temp; //成员变量
}
@end
@implementation Test
@end int main()
{ Test *t = [[Test alloc] init];
t.temp = 100;
NSLog(@"%d",t.temp);
return 0;
}

把代码中的t->temp改成lt.temp,发现又会报错,错误说明为Propetery temp not found。。。,也即是说没有找到temp这个属性,当然找不到,因为我们没有定义这个属性。

这时再在成员变量的声明后加一行代码

@property int temp;

代码通过,没有错误,说明.点语法是用来访问属性的。再进一步猜想@propetery是声明set、get方法,要是我有set、get方法没有声明@propetery可不可以呢,试试就知道

 #import <Foundation/Foundation.h>

@interface Test : NSObject
{
int temp; //成员变量
}
-(void)setTemp:(int)temp;
-(int)Temp;
@end
@implementation Test -(void)setTemp:(int)temp
{
}
-(int)Temp
{
}
@end int main()
{ Test *t = [[Test alloc] init];
t.temp = 100;
NSLog(@"%d",t.temp);
return 0;
}

偷懒没有实现方法,但是同样没有报错,也就说明证实了猜想。

至此大概清楚.(点)和->(箭头)的区别了:

.(点语法)是访问类的属性,本质是调用set、get方法。

->是访问成员变量,但成员变量默认受保护,所以常常报错,手动设为public即可解决

OC .(点)与->(箭头)用法区别的更多相关文章

  1. order_by_、group_by_、having的用法区别

    写于 2012-11-20 22:14  doc文档上. Having 这个是用在聚合函数的用法.当我们在用聚合函数的时候,一般都要用到GROUP BY 先进行分组,然后再进行聚合函数的运算.运算完后 ...

  2. html中的alt和title用法区别

    html中的alt和title用法区别 首先明确一下概念,alt是html标签的属性,而title既是html标签,又是html属性.title标签这个不用多说,网页的标题就是写在<title& ...

  3. 转 SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题

    SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题 SQL Union和SQL Union All用法 SQL UNION 操作符 UN ...

  4. css选择器,有箭头与没箭头的区别

    div > span 和 div span 的区别 ,即有箭头和没箭头的区别 div > span span 是 div 的下一层级关系 在这种情况下找得到span元素: <div& ...

  5. php中strstr、strrchr、substr、stristr四个函数用法区别

    php中strstr.strrchr.substr.stristr四个函数用法区别: php中strstr strrchr substr stristr这四个字符串操作函数特别让人容易混淆,常用的是s ...

  6. mysql SELECT FOUND_ROWS()与COUNT(*)用法区别

    在mysql中 FOUND_ROWS()与COUNT(*)都可以统计记录,如果都一样为什么会有两个这样的函数呢,下面我来介绍SELECT FOUND_ROWS()与COUNT(*)用法区别   SEL ...

  7. php中print_r、var_dump和var_export几个函数的用法区别

    php中print_r.var_dump和var_export几个函数的用法区别

  8. Oracle中 (+)与left join 的用法区别

    Oracle中 (+)与left join 的用法区别 原创 2017年01月11日 13:33:42 6648 select * from a,b where a.id=b.id(+); (+)写在 ...

  9. String split方法与Guava Splitter用法区别

    String split方法与Guava Splitter用法区别 今天同事写了一段使用String split方法的代码,如下所示,同事期望得到的是字符"1",但是没想到却得到空 ...

随机推荐

  1. Bootstrap排版中地址与引用详解

    地址元素address 我们的地址在HTML5中增加了一个address标签,可以把我们的地址写在address标签里面,address里面强调换行等等都是可以的. 实例: <address&g ...

  2. 攻城狮在路上(壹) Hibernate(四)--- 对象标识符(OID)生成机制

    Hibernate使用对象标识符(OID)来建立内存中对象和数据库表中记录的对应关系,对象的OID和数据库的主键对应.为了保证OID的唯一性和不可变性,应该让Hibernate来为OID赋值.Hibe ...

  3. solr课程学习系列-solr的概念与结构(1)

    Solr是基于Lucene的采用Java5开发的一个高性能全文搜索服务器.源于lucene,却更比Lucene更为丰富更为强大的查询语言.同时实现了可配置.可扩展并对查询性能进行了优化,并且提供了一个 ...

  4. 在Xcode4中给程序提供命令行参数(转)

    网上xcode4的资料实在是不多,再加上xcode4相对3的改动还那么大,并且还只有英文版.我为了这个问题头痛了很久.后来终于找到了...方法如下 xcode菜单的Product->EditSc ...

  5. java_method_Log输出日志的方法

    package cn.com.qmhd.tools; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigura ...

  6. java 根据时间生成唯一id

    主要是依据当前系统毫秒数,但若用循环测试,同一毫秒依然会循环很多次, 系统毫秒数是13位, 公司的解决方法是再加5位的自增数,从00001开始, 于是登录淘宝查看,淘宝的id是13位的数字,猜测应该是 ...

  7. django2.0升级日记

    1.大量的外键定义需要加on_delete参数 2.'WSGIRequest' object has no attribute 'session',这个问题是因为settings中middleware ...

  8. 洛谷P5245 【模板】多项式快速幂(多项式ln 多项式exp)

    题意 题目链接 Sol \(B(x) = \exp(K\ln(A(x)))\) 做完了... 复杂度\(O(n\log n)\) // luogu-judger-enable-o2 // luogu- ...

  9. Java连接MySQL数据库详细教程(附网盘下载地址)

    准备工具 Eclipse-oxygen-64位 http://pan.baidu.com/s/1gf48FIj MySQL-5.7.17 http://pan.baidu.com/s/1skD14Cl ...

  10. PHP从入门到精通(四)

    PHP数组中的常用函数汇总 为了更直观的讲解各函数的作用和用法,方便大家的理解,首先,我们来定义一个数组.下面各函数的操作将以本数组为例: $arr = array(1,2,3,4,5,6," ...