为什么80%的码农都做不了架构师?>>>
⼀、实例变量可⻅度
@public 在类的外部和内部均可访问
@protected(默认) 只能在该类和其⼦类内访问
@private 只能在该类内访问
⼆、⽅法(定义、声明、调用)
OC中的方法分两种:类方法、实例方法
同一个类中,所有的方法中不能出现重名
方法的声明
- (返回值类型)方法名:(参数类型1)参数名1 修饰词:(参数类型2)参数名2
- (paraType)methodName:(paraType)paraName1 descripName:(paraType)paraName2
方法的调用
类方法 + 只能类调用 [class_name class_method_name];
类方法中,不能使用实例变量(调用类方法时,没有创建对象)
+ (void)sayHi;
实例方法 - 只能对象调用 [object_name instance_method];
- (void)sayHello;
三、setter、getter
setter:设置实例变量的值
- (void)setName:(type)name;
getter:获取实例变量的值
- (type)name;
OC2.0.setter
如果通过setter方法为对象设置初始值,需通过以下方式:
- (void) setOrigin: (XYPoint *) pt
{
if (origin)
[origin release];
origin = [[XYPoint alloc] init];
[origin setX: pt.x andY: pt.y];
}
原因:若不alloc,创建多个对象后,指针指向同一内存区域,修改某一个对象的origin将会改变所有对象的origin值。
四、自定义初始化方法
使用自定义初始化方法创建对象
创建对象后,不能再调用初始化方法
- (id)initWithName1:(type)name1 name2:(type)name2 …;
五、类的调用
#import "ClassName.h"
循环调用的产生:
A.h: #import "B.h"
B.h: #import "A.h"
编译器执行时,在#import 处出现死循环,永远执行不到@interface ,因此所导入的类不可被识别
防止循环调用
在 .h 文件中使用 @class ClassName; 告知编译器class后面的标识符是一个类
在 .m 文件中 使用 #import 导入所需类所在文件
简答题:
1、实例变量的可见度有哪几种?默认的是什么?(中英文都要记)
@public @protected @private
2、如何对一个类的默认可见度的实例变量进行赋值和取值?
getter&setter method
3、面向对象编程的三大特征?
封装(保证了属性与方法的关联性)
继承(代码复用)
多态(在代码复用的同时,强化了个性差异)
4、什么是封装?
封装:对外提供声明,对内隐藏内部实现
5、#import有什么作用?#import和#include有什么不同?
#include 和 #import的区别
(1)include不能重复导入同一个文件
(2)import可以重复导入同一个文件
(3)现在include和import都可以重复导入
6、对象的内存分配在哪个区?
堆区
7、堆区和栈区的区别(从内存的分配和回收考虑)
栈区由系统负责分配和回收
堆区由开发者负责分配和回收
8、OC中的方法有几类?OC中有私有方法吗?
两类:类方法、实例方法
9、如何确定两个方法是否同名?
10、-(id)setName:(NSString *)name :(NSString *)sex age:(int)age的方法名是什么?
setName: : age:
11、定义并实现一个实例变量的setter和getter方法。
12、#import ” ”和#import < >有什么区别?
“” 导入用户文件
<> 导入系统文件
13、@class有什么作用?#import和@class有什么区别?
@class告知编译器系统class后面的标识符是一个类,并没有导入这个类的内容
#import导入文件的内容