Learn the object-c on MAC(中译本: Object-C 基础教程 ) 学习笔记

【comments to this book】Object-C 基础教程 这本书翻译的水平很高,浅显易懂.

  1. 隐藏的self.

在使用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;

 

 

  1.    2.  响应消息

对象在收到消息的时候,会现在当前的类中去搜索对应的方法,如果找不到就会到他的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. 重写分为两种:

  • 完全重写
  •   基于superclass类的方法基础上来增加, 对应的代码结构如下

 

Method

{

        Xxx  // set parameter

       [super method]

      Xxx  //修改由父类的方法产生的结果

}

 

6. 复合

复合是通过包含作为实例变量的对象指针实现的。

 

7. @class 告诉编译器,我定义是一个类, 通常被用于解决在实现复合而不需要import 对应的头文件,和类的循环引用.

 

8.  NSArray有两个限制

 

  • Array的元素只能是object_c的对象,不能是C语言的基本类型,如int, float, char
  •   不能将nil直接赋值给array的元素.

 

 

9. @property  float a; 声明一个具有float类型的属性,名字为a. @property预编译指令的作用是自动声明属性的settergetter方法,实际上的名字不必与实例变量相同,虽然按照一般的使用习惯他们是一样的. 属性是访问实例变量的一种快捷方式,如果属性与变量名称不同,需要指定属性所要操作的实例变量

   @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.

  

属性只能取代settergetter,而不能取代其他的带有额外参数对实例变量的操作.

 

 

10 .操作符

Instance_string  = @”hello world”;  //compiler 会假设直接去操作实例变量

self.instance_string =@”hello world”; //.操作符会告诉compiler,我们使用存取方法进行操作.

 

.操作符不是像C语言中的那样通过地址的偏移来访问instance variable,本质上还是通过由property生成的accessor发送消息给对象

 

 

11. 类别只是扩展了一个类的方法,并没有为这个类添加新的变量或者属性,类别会被这个类的子类所继承

12. objective-c中没有真正意义上的私有方法,只要你知道某个类所支持的方法,即使这个方法没有在类的接口中定义,你仍然可以调用它。这个说法的另一面,就是可以直接在.m中区实现一个在.h中没有定义的方法。

 

 

 

 

你可能感兴趣的:(Objective-C,property,实例变量,休闲,Object-C)