文档章节

核心与法,关键字

Heisenbean
 Heisenbean
发布于 2014/09/15 18:16
字数 902
阅读 66
收藏 0

点语法:                                                                                                          

用途:

OC当中通过@property和 @synthesize 配对使用来自动生成变量的set和get方法,通过使用点语法可以大大减少我们程序员代码量,也方便学习过其他语言的人上手OC语言

简而言之:

1.减少代码量

2.方便其他语言使用者阅读

用法:

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
    Person *p = [Person new];
//   [p setAge:10];      //用点语法代替就是                p.age = 10;
//   int a = [p age];    //用点语法代替就是                int a = p.age;

    NSLog(@"Age is %d",a);
    return 0;
}

编译器遇到点语法时,会自动展开成其相应的方法



@property                                                                                                          

@property可以自动生成某个成员变量的settergetter声明,但是.h文件中还是要写实现

比如:

.h文件中

@property int  age;   // 这行可以代替下面两行
// -(void) setAge:(int)age;
// -(int)age;

@synthesize                                                                                                       

@synthesize可以在.m文件中自动生成settergetter的实现,并且会访问该成员变量

比如:

@synthesize int age = _age;  // 等号左边的age是@synthesize要实现的变量名
                            //  右边的_age是@synthesize要返回的变量名,就是要赋值的变量

如果@synthesize定义一个未知的变量,那么这个变量的默认就是@private类型的

Xcode4.4以后,其实只需要用@property这个关键字就行了,它会自动生成成员变量,会声明和实现getter和setter方法

其缺陷是自动生成的成员变量是@private,子类只能通过getersetter方法访问,但是可以手动改变成员变量的作用域



description                                                                                                          

description默认返回的是 <类名:内存地址>

#import <Foundation/Foundation.h>
#import "Person.h"
int main()
{
    Person *p = [[Person alloc] init];
    p.age = 20;
    p.name = @"jack";
    NSLog(@"%@",p);
return 0;
}

此时输出的结果就是person:内存地址

因为Nslog(@"%@",p);这句会调用pdescription方法,而方法默认返回的就是 <类名:内存地址>,所以想要返回自己想要的结果,可以在.m文件中修改description方法的返回值

#import "Person.h"
@implementation Person
- (NSString *)description
{
    return [NSString stringWithFormat:@"%d,%@",_age,_name];
}
@end

此时NSlog输出的就是年龄和名字了


SEL                                                                                                                     

每个方法都有一个和他相对应的SEL数据,每个SEL数据都相对应着这个方法的地址

也可以理解为SEL就是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址,找到方法地址就可以调用方法

方法调用的过程:

当调用方法的时候,编译器会把方法包装成SEL类型的数据,然后去类里找这个SEL数据相对应的方法的地址,找到之后就会调用这个方法

以上操作是有缓存的

其实调用方法还可以用SEL数据来调用

[p performSelector:@selector(test)]; // 效果和[p test];一样

带参数的方法调用:

[p performSelector:@selector(test3:) withObject:@"hhe"];

 在一个方法中用如下使用selfSEL数据,会引发死循环

[self performSelector:_cmd];


NSLog输出补充                                                                                                    

    // 指针变量地址
    NSLog(@"%p",&p);
    // 对象地址
    NSLog(@"%p",p);
    // <类名:对象地址>
    NSLog(@"%@",p);

NSLog输出C语言字符的时候 不允许有中文

NSLog(@"%s",str);

id                                                                                                                        

id是一种数据类型,被叫做万能指针,可以操作任何OC对象,因为id这个类型已经被写入了”*“,所以不用再加上星号

sample code:

int main()
{
   //Person *p = [Person new];
   //只适用OC对象
   
    id person = [Person new];
    [person setAge:10];
    NSLog(@"age=%d",[person age]);
    return 0;
}


© 著作权归作者所有

Heisenbean
粉丝 0
博文 16
码字总数 20720
作品 0
漯河
高级程序员
私信 提问
算法预备军(5)~散列表

散列表又称为Hash表,核心体现在Hash算法上,而Hash算法又是加密算法的一种,所以我们很有必要去了解一下散列表。 一些概念 我们看一个公式:存储位置=f(关键字),我们将根据这个公式来理解散...

GeneralAndroid
2017/11/21
0
0
[课程复习] 数据结构之线性表、树、图、查找、排序经典算法复习

版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习,一起进步~ https://blog.csdn.net/Eastmount/article/details/88391773 作者最近在复习考博,乘此机会分享一些计算机科...

Eastmount
03/11
0
0
慕课网Flask高级编程实战-7.静态文件、模板、消息闪现与Jinja2

7.1 静态文件访问原理 1.默认访问方法 Flask访问静态文件非常简单,只需要在项目根目录建立static文件夹。将静态资源文件放入static下即可。访问的时候访问即可。 需要注意的是,这里的根目录...

Meet相识_bfa5
2018/06/13
0
0
PostgreSQL完全刷缓存补丁

本文及其附件以PostgreSQL协议发布 曾经有朋友问过如何把缓存清空,没有这个功能,测试的时候非常不方便。 我做了一个补丁抛砖引玉,见附件。 提供两个SQL命令,尽量兼容Oracle: 1、ALTER S...

有理想的猪
2013/11/13
1K
6
如何高效学习-斯科特杨 读书总结

如何高效学习-斯科特杨 读书总结 以下内容为如何高效学习书籍内容总结: 书籍简介 一位因为快速学习而成名的神奇小子,他应用自己发明的学习方法,完成了10天搞定线性代数,1年学习4年MIT课程...

wwlcsdn000
2017/11/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
12
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
9
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部