黑马程序员--Objective-C——OC特有语法二
2015-07-13 15:12
555 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
分类的创建方法:
右击项目,选择New File,选择第二项Object-C Category,在Category里输入分类的名字,在Category on里输入在哪个类上创建分类。
Category的好处是可以将一个很大的类分模块或者分工编写,使得这个类的结构更清晰。Category还可以用于给系统函数添加类方法和对象方法。
使用Category的时候要注意:
1)Category可以访问原始类的实例变量,但不能添加变量,只能添加方法。如果想添加变量,可以考虑通过继承创建子类
2)Category可以实现原始类的方法,但不推荐这么做,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法
3)多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效
新建一个Person类,直接打印出对象。
可以看到打印出了类名和对象的内存地址,这就是打印对象默认的格式。
那如何输出类的属性和值呢?
我们在Person.m中重写- description方法
OC调用方法时,并不是直接在类中根据方法名来找。而是把方法名包装成SEL类型的数据,根据SEL找到对应的方法地址,最后根据方法地址调用方法。
使用[p performSelector:@selector(test1)];可以执行test1方法。
@selector将方法名test1包装成SEL类型。
performSelector传入SEL类型的数据执行方法。
带参数的SEL:
[p performSelector:@selector(test2:) withObject:@"我是参数"];
Person.h
Person.m
main.m
运行结果:
一、Category分类
在OC中,对一个类扩充除了使用继承,还有一种方法是使用Category。分类其实就是在类的声明和实现后面增加一个括号,括号里写上分类名称。<span style="background-color: rgb(255, 255, 255);">@interface 类名 (分类名称) // 方法声明 @end</span>
分类的创建方法:
右击项目,选择New File,选择第二项Object-C Category,在Category里输入分类的名字,在Category on里输入在哪个类上创建分类。
Category的好处是可以将一个很大的类分模块或者分工编写,使得这个类的结构更清晰。Category还可以用于给系统函数添加类方法和对象方法。
使用Category的时候要注意:
1)Category可以访问原始类的实例变量,但不能添加变量,只能添加方法。如果想添加变量,可以考虑通过继承创建子类
2)Category可以实现原始类的方法,但不推荐这么做,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法
3)多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效
二、description方法
使用NSLog和%@输出类和对象时,会调用类和对象的+description方法和-description方法。这个方法相当于Java语言中的toString方法,新建一个Person类,直接打印出对象。
<span style="background-color: rgb(255, 255, 255);">#import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { Person *p = [[Person alloc] init]; p.age = 20; p.name = @"alin"; NSLog(@"%@", p); return 0; }</span>
可以看到打印出了类名和对象的内存地址,这就是打印对象默认的格式。
那如何输出类的属性和值呢?
我们在Person.m中重写- description方法
<span style="background-color: rgb(255, 255, 255);">#import "Person.h" @implementation Person - (NSString *)description { return [NSString stringWithFormat:@"名字:%@,年龄:%d", _name, _age]; } @end</span>
三、SEL
SEL是一种数据类型。OC调用方法时,并不是直接在类中根据方法名来找。而是把方法名包装成SEL类型的数据,根据SEL找到对应的方法地址,最后根据方法地址调用方法。
使用[p performSelector:@selector(test1)];可以执行test1方法。
@selector将方法名test1包装成SEL类型。
performSelector传入SEL类型的数据执行方法。
带参数的SEL:
[p performSelector:@selector(test2:) withObject:@"我是参数"];
Person.h
<span style="background-color: rgb(255, 255, 255);">#import <Foundation/Foundation.h> @interface Person : NSObject - (void)test1; - (void)test2:(NSString *)str; @end</span>
Person.m
<span style="background-color: rgb(255, 255, 255);">#import "Person.h" @implementation Person - (void)test1 { NSLog(@"----test1"); } - (void)test2:(NSString *)str { NSLog(@"test3-----%@",str); } @end</span>
main.m
<span style="background-color: rgb(255, 255, 255);">#import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { Person *p = [Person new]; [p performSelector:@selector(test1)]; [p performSelector:@selector(test2:) withObject:@"我是参数"]; }</span>
运行结果:
相关文章推荐
- 黑马程序员--Objective-C——OC特有语法一
- 黑马程序员--Objective-C——XCode使用技巧
- 黑马程序员--Objective-C——面向对象三大特性
- 黑马程序员--Objective-C——第一个OC程序
- Objective-C不能用@try
- 修改mysql登陆时error while loading shared libraries: libncurses.so.5: cannot open shared object file
- JavaScript复习笔记:Object(对象)
- Objective-C中的instancetype和id区别
- Object-C非正式协议与正式协议的区别
- Objective-C - 类的静态常量
- Objective-C - 容器元素转换NSInteger
- Objective-C - NSInteger转换NSString
- Objective-C - NSMutableArray添加NSInteger元素
- android setTag (int key, Object tag)抛出IllegalArgumentException的问题
- 黑马程序员_JAVA之API(Object,Scanner,数组高级,包装等类)
- Objective-c开发教程--如何在项目中使用AFNetworking
- GObject对象系统
- 盲人摸象——IOS简单应用ToDoList(Objective-c)
- Objective-c开发教程--MRC和ARC混编
- 如何解决CRITICAL glance [-] AttributeError: 'NoneType' object has no attribute 'drivername'