黑马程序员—OC语言小知识点及示例
2015-10-05 20:21
543 查看
一、BOOL的本质:typedef signed char BOOL; 只有两种取值:YES、NO。
二、OC中的nil,相当于C语言中得NULL,也就是0。
三、对象方法只能由对象调用,类方法只能由类调用
结果输出:
类方法test2
对象方法test1
四、父类必须声明在子类的前面
五、子类不能再定义和父类相同的成员变量
六、子类重写父类中的某个方法,覆盖父类以前的方法
程序运行结果:子类test方法
七、在调用方法时,优先在当前类中找,如果找不到,去父类中找
八、id 万能指针,能指向任何OC对象,相当于NSObject *
#import <Foundation/Foundation.h> int main() { BOOL b = YES; // YES相当于1 BOOL b1 = NO; // NO相当于0 NSLog(@"%hhd,%hhd", b, b1); return 0; }由于BOOL类型中的YES相当于1,NO相当于0,最后程序输出结果为:1,0
二、OC中的nil,相当于C语言中得NULL,也就是0。
#import <Foundation/Foundation.h> int main() { NSString *str = nil; NSLog(@"%@", str); return 0; }程序输出结果为:(null)
三、对象方法只能由对象调用,类方法只能由类调用
<pre name="code" class="objc">#import <Foundation/Foundation.h> @interface Person : NSObject - (void)test1; + (void)test2; @end @implementation Person - (void)test1 { NSLog(@"对象方法test1"); } + (void)test2 { NSLog(@"类方法test2"); } @end int main() { Person *p = [Person new]; [Person test2]; // 类名调用类方法 [p test1]; // 对象名调用对象方法 // 下面的调用方式报错 //[Person test1]; //[p test2]; return 0; }
结果输出:
类方法test2
对象方法test1
四、父类必须声明在子类的前面
#import <Foundation/Foundation.h> // 父类Person @interface Person : NSObject @end @implementation Person @end // 子类Student @interface Student : Person @end @implementation Student @end int main() { return 0; }像这种是可以的,还有,并不是父类的声明和实现要全部在子类前面才行,其实只要保证父类的声明在子类的声明前面就可以,像下面的例子:
#import <Foundation/Foundation.h> // 父类Person @interface Person : NSObject @end // 子类Student @interface Student : Person @end @implementation Student @end @implementation Person @end int main() { return 0; }但像下面这种情况就是错误的了:
#import <Foundation/Foundation.h> // 子类Student @interface Student : Person @end // 父类Person @interface Person : NSObject @end @implementation Student @end @implementation Person @end int main() { return 0; }
五、子类不能再定义和父类相同的成员变量
#import <Foundation/Foundation.h> // 父类Person @interface Person : NSObject { int _age; } @end @implementation Person @end // 子类Student @interface Student : Person { int _age; int _weight; } @end @implementation Student @end int main() { return 0; }这段代码,由于在父类Person中已经定义了_age变量,子类继承于父类也就自然的拥有了父类的成员变量,但子类中又定义_age就类似于同一个类中定义两个_age变量,造成重复定义。
六、子类重写父类中的某个方法,覆盖父类以前的方法
#import <Foundation/Foundation.h> // 父类Person @interface Person : NSObject - (void)test; @end @implementation Person - (void)test { NSLog(@"父类test方法"); } @end // 子类Student @interface Student : Person @end @implementation Student // 重写父类方法 - (void)test { NSLog(@"子类test方法"); } @end int main() { Student *s = [Student new]; [s test]; return 0; }
程序运行结果:子类test方法
七、在调用方法时,优先在当前类中找,如果找不到,去父类中找
#import <Foundation/Foundation.h> // 父类Person @interface Person : NSObject - (void)test; @end @implementation Person - (void)test { NSLog(@"父类test方法"); } @end // 子类Student @interface Student : Person @end @implementation Student @end int main() { Student *s = [Student new]; [s test]; return 0; }程序运行结果:父类test方法
八、id 万能指针,能指向任何OC对象,相当于NSObject *
#import <Foundation/Foundation.h> @interface Person : NSObject @end @implementation Person @end @interface Student : NSObject @end @implementation Student @end int main() { id d1 = [Person new]; id d2 = [Student new]; id d3 = [NSString new]; d3 = @"123"; NSLog(@"%@",d3); return 0; }上面程序中的三个万能指针都是正确的,最后程序的输出结果为:123
相关文章推荐
- 浅谈C++多态性
- 【static&extern】c语言static用法
- C++学习–基础篇(书籍推荐及分享)
- C语言的小知识(二)
- C++中如何修改const变量 (指针)
- MFC ODBC(一)
- 《C++primer(第五版)》学习之路-第十八章:用于大型程序的工具
- 快速幂的基本概念
- C语言的谜题
- 大话设计模式C++达到-文章16章-国家模式
- C++中int型128转入char型变量c中
- 深入理解C/C++ [Deep C (and C++)]
- C语言中指针数组和数组指针
- 【C++学习】float与double的范围和精度
- Bridge(桥接)设计模式
- C++11新特性--右值引用
- 【源码】员工管理系统c++大型实验,含实验报告
- C/C++基本输入输出函数
- 面试复习(C++)之希尔排序
- 第二周-项目1 - C/C++语言中函数参数传递的三种方式