【comments to this book】Object-C 基础教程 这本书翻译的水平很高,浅显易懂.
在使用instance method的时候,self会隐含的指向接收消息的那个对象. 例如
@interface classA
{
Color;
}
-setColor: color
@end
如果在代码中使用如下code
Object_a1 = [classA alloc]
Object_a2 = [classA alloc]
[object_a1 setColor: blue] // self = object_a1
[object_a2 setcolor: red] // self = object_a2;
对象在收到消息的时候,会现在当前的类中去搜索对应的方法,如果找不到就会到他的superclass去寻找,直到找到对应的方法,或者出错. (section 4.3.1)
3. 内存布局
新添加的实例变量会被附加在superclass的实例变量之后, 因此在内存中
例如
@interface classA
{
Color;
}
@end
@interface classAA : Class A
{
Shape;
}
@end
classAA的一个对象的内存布局(suppose 4 bytes aligned)就会如下所示:
base_addr+0x0000 color
base_addr+0x0004 shape
对于实例变量的访问是利用”基址+offset”的方式进行的,所以在superclass中添加实例变量就会造成已经存在的binary code有问题。 例如在上面的例子中如果需要在classA中增加background _color的话,就会造成shape对应的offset变成8 bytes.
4. Isa
NSoject的实例变量被称为isa,是因为子类和NSObject类之间建立了”is a xx”的关系.
5. 重写分为两种:
Method
{
Xxx // set parameter
[super method]
Xxx //修改由父类的方法产生的结果
}
6. 复合
复合是通过包含作为实例变量的对象指针实现的。
7. @class 告诉编译器,我定义是一个类, 通常被用于解决在实现复合而不需要import 对应的头文件,和类的循环引用.
8. NSArray有两个限制
9. @property float a; 声明一个具有float类型的“属性”,名字为a. @property预编译指令的作用是自动声明属性的setter和getter方法,实际上“属性”的名字不必与实例变量相同,虽然按照一般的使用习惯他们是一样的. 属性是访问实例变量的一种快捷方式,如果属性与变量名称不同,需要指定属性所要操作的实例变量
@synthesize 预编译指令创建该属性的访问器。
@interface classA
{
int instance_variable;
}
@ property int property_name;
@end
@implementation classA
@synthesize property_name = instance_variable;
@end
在上面的code中,可以通过property_name去访问instance_variable. 在一个类中,不能有多个属性指向同一个实例变量,否则 在synthesize的地方会报compile error.
属性只能取代setter和getter,而不能取代其他的带有额外参数对实例变量的操作.
10 .操作符
Instance_string = @”hello world”; //compiler 会假设直接去操作实例变量
self.instance_string =@”hello world”; //.操作符会告诉compiler,我们使用存取方法进行操作.
.操作符不是像C语言中的那样通过地址的偏移来访问instance variable,本质上还是通过由property生成的accessor发送消息给对象
11. 类别只是扩展了一个类的方法,并没有为这个类添加新的变量或者属性,类别会被这个类的子类所继承
12. 在objective-c中没有真正意义上的私有方法,只要你知道某个类所支持的方法,即使这个方法没有在类的接口中定义,你仍然可以调用它。这个说法的另一面,就是可以直接在.m中区实现一个在.h中没有定义的方法。