黑马程序员—16-oc核心语法

一、    变量作用域

l  变量的作用域主要分为四种:

u  (1)@public (公开的)在有对象的前提下,任何地方都可以直接访问。

u  (2)@protected (受保护的)只能在当前类和子类的对象方法中访问

u  (3)@private (私有的)只能在当前类的对象方法中才能直接访问

u  (4)@package (框架级别的)作用域介于私有和公开之间,只要处于同一个框架中就可以直接通过变量名访问

l  使用注意和补充

u  (1)在类的实现即.m文件中也可以声明成员变量,但是因为在其他文件中通常都只是包含头文件而不会包含实现文件,所以在这里声明的成员变量是@private的。在.m中定义的成员变量不能喝它的头文件.h中的成员变量同名,在这期间使用@public等关键字也是徒劳的。

u  (2)在@interface  @end之间声明的成员变量如果不做特别的说明,那么其默认是protected的。

u  (3)一个类继承了另一个类,那么就拥有了父类的所有成员变量和方法,注意所有的成员变量它都拥有,只是有的它不能直接访问。

二、@[email protected]

l  让编译好器自动编写一个与数据成员同名的方法声明来省去读写方法的声明。

1)声明property的语法为:@property (参数1,参数2) 类型 名字;

如:

@property(nonatomic,retain) UIWindow *window;

1) 实现 synthesize的语法为:@synthesize  age = _age;

l 手动实现

u 若手动实现了setter方法,编译器就会自动生成getter方法。反之,若手动实现了getter方法,编译器会自动生成setter方法。

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

三、构造方法

l 构造方法:用来初始化对象的方法,是对象方法。

l 构造方法的目的,为了让对象创建出来,成员变量就会有一些固定值。

l 重写构造的注意点

Ø   先调用父类的构造方法([super  init])

Ø   再进行子类内部成员变量的初始化

l 自定义构造方法规范

Ø 一定是对象方法,一定是以_开头

Ø 返回值一般是id类型

Ø 方法名一般以init开头

l 自定义一个构造方法

- (id) initWithName:(NSString*)name andAge:(int)ageandNo:(int)no

{

If(self= [super     init])

{

_no= no;

self.name= name;

self.age= age;

}

returnself;

}

四、分类

Ø   如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式

l   继承

l   分类(Category)

1.  格式

Ø   分类的声明

@interface 类名 (分类名称)

// 方法声明

@end

Ø   分类的实现

@implementation 类名 (分类名称)

// 方法实现

@end

2.  好处

Ø   一个庞大的类可以分模块开发

Ø   一个庞大的类可以由多个人来编写,更有利于团队合作

3.  注意

Ø   Category可以访问原始类的实例变量,但不能添加变量,只能添加方法。如果想添加变量,可以考虑通过继承创建子类

Ø   Category可以实现原始类的方法,但不推荐这么做,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法

Ø   多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效

五、类的本质

1.  类也是个对象

Ø   其实类也是一个对象,是Class类型的对象,简称“类对象”

Ø   Class类型的定义

typedef struct objc_class *Class;

Ø   类名就代表着类对象,每个类只有一个类对象

2.  +load和+initialize

Ø   +load

l   在程序启动的时候会加载所有的类和分类,并调用所有类和分类的+load方法

l   先加载父类,再加载子类;也就是先调用父类的+load,再调用子类的+load

l   先加载元原始类,再加载分类

l   不管程序运行过程有没有用到这个类,都会调用+load加载

Ø   +initialize

l   在第一次使用某个类时(比如创建对象等),就会调用一次+initialize方法

l   一个类只会调用一次+initialize方法,先调用父类的,再调用子类的

3.  获取类对象的2种方式

Class c = [Person class]; // 类方法

或者

Person *p = [Person new];

Class c2 = [p class]; // 对象方法

4.  类对象调用类方法

Class c = [Person class];

Person *p2 = [c new];

六、description分类

1. -description方法

使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出

2. +description方法

使用NSLog和%@输出某个类对象时,会调用类对象+description方法,并拿到返回值进行输出

3. 修改NSLog的默认输出

l   重写-description或者+description方法即可

4. 死循环陷阱

l   如果在-description方法中使用NSLog打印self

七、SEL

1.  方法的存储位置

Ø   每个类的方法列表都存储在类对象中

Ø   每个方法都有一个与之对应的SEL类型的对象

Ø   根据一个SEL对象就可以找到方法的地址,进而调用方法

Ø   SEL类型的定义

typedef struct objc_selector    *SEL;

2.  SEL对象的创建

SEL s = @selector(test);

SEL s2 = NSSelectorFromString(@"test");

3.  SEL对象的其他用法

// 将SEL对象转为NSString对象

NSString *str = NSStringFromSelector(@selector(test));

Person *p = [Person new];

// 调用对象p的test方法

[p performSelector:@selector(test)];

八、   NSLog输出增强

Ø   __FILE__:源代码文件名

Ø   __LINE__:NSLog代码在第几行

Ø   _cmd:代表着当前方法的SEL

// 下面的代码会引发死循环

- (void)test {

[self performSelector:_cmd];

}

时间: 2024-11-08 22:29:15

黑马程序员—16-oc核心语法的相关文章

【黑马程序员】————OC特有语法

一.点语法 点语法的本质还是方法调用 p.age = 10; // [p setAge:10]; int a = p.age; // [p age]; 二.成员变量的作用域 @public : 在任何地方都能直接访问对象的成员变量 @private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private) @protected : 可以在当前类及其子类的对象方法中直接访问 (@interface中默认就是@protected) @package : 只要处在

【黑马程序员】OC基本语法——类与对象相关概念

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 最近在学OC的面向对象部分,可能是因为以前学Java和PHP时习惯了主流的面向对象思想,接触到OC的面向对象有很多说法都不习惯,查了很多东西,终于基本都搞清楚了,在这里小结一下. 一.类和对象 1.类:类是一个抽象概念,代表着一类事物,如:人,动物,交通工具等:这个和Java或PHP里类的概念没有区别. 其定义方法如下: @interface Student : NSObject { NSSt

黑马程序员——C语言——基础语法

首先学的是C语言的基础语法,主要分为关键字.标示符.注释.数据.常量.变量. 一.关键字 1   关键字是指在C语言中系统默认的有特殊意义的字符 2   关键字全部是小写字母表示,总共32个关键字(主函数[main]中int .return),如下: auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned

黑马程序员————C语言基本语法(关键字、标识符、注释符、变量、Scanf函数)

第一讲 关键字 1.什么是关键字? 1) 关键字就是C语言提供的有特殊含义的符号,也叫做“保留字” 2) C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义 C语言关键字 auto局部变量(自动储存) break 无条件退出程序最内层循环 case   switch 语句中选择项 char  单字节整型数据 const  定义不可更改的常量值 continue 中断本次循环,并转向下一次循环 default switch 语句中的默认选择项 do  用于构成do.....while

黑马程序员——c语言基础语法(二)

指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值.未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机.指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误.在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址. 两个有关的运算符: &:取地址运算符. *:指针运算符(或称“间接访问” 运算符). C语言中提供了地址运算符&来表示变量的地址.其一般形式为:&变量名: 如&a表示变量a的地址,&b表示

黑马程序员—C语言基础语法的学习

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 以下为自己的学习总结与学习笔记,可能有不全面不到位的地方,也欢迎大家一起分享指正. C语言是世界上最流行.使用最广泛的高级程序设计语言之一,其主要的用途包括 1.编写系统软件.图形处理.单片机程序.嵌入式系统开发 2.编写游戏外挂 3.编写android程序 4.编写iOS程序 任何一个C语言的程序都是由一个或者多个程序段组成的,而这些有着自己功能的程序段就是函数了,说到函数,就不得不提mai

黑马程序员 ---- C 语言基础语法

C 语言基础语法 C程序是由函数组成. C程序的入口是一个名字叫做 main 的函数,简称main函数. 不管程序中有多少函数,都是先执行main函数. 1 #include <stdio.h> 2 3 int main(void) 4 5 { 6 7 return 0; 8 9 } 1.编写 2.编译 cc -c 文件名.c 生成 .o 文件 3.链接 cc 文件名.o      // 2.3结合在一起:  cc 文件名.c -o 文件名 4.运行 ./a.out // ./文件名 C语言中

黑马程序员————C语言基础语法二(算数运算、赋值运算符、自增自减、sizeof、关系运算、逻辑运算、三目运算符、选择结构、循环结构)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一讲  算数运算 C语言一共有34种运算符,包括了常见的加减乘除运算 1.加法运算+ 除开能做加法运算,还能表示正号:+5.+90 2.减法运算- 除开能做减法运算,还能表示符号:-10.-29 3.乘法运算* 注意符号,不是x,而是* 4.除法运算/ 注意符号,不是÷,也不是\,而是/ 整数除于整数,还是整数.1/2的值是0,这个并不是二分之一 5.取余运算% 什么是取余:两个整数相除之后

黑马程序员----java基础--基础语法知识

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.常见的DOS命令 1 cd---------进入指定目录 2 cd.. -------退出到上级目录 3 cd\--------退出到根目录 4 md----------创建文件夹 5 rd--------------删除文件夹 6 del-----------删除文件 7 dir--------列出当前目录下的文件和文件夹 8 exit------退出dos命令行  二.java注意的地

《黑马程序员》 OC的三大特性

OC 的三大特性:封装.继承.多态. 封装:过滤不合理的值 #import <Foundation/Foundation.h> // set 方法 // 作用:提供一个方法给外界设置成员变量,可以在方法对成员变量进行赋值和过滤 // get 方法 // 作用:返回对象内部的成员变量,得到成员变量的值. @interface Student : NSObject { // 成员变量名的命名规范 // 成员变量名肯定以下划线开头 // 好处:可以区分参数名称和成员变量的名称,也可以区分变量名和成员