A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 该有个目标了 中级黑马   /  2014-8-23 00:53  /  1265 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

基础知识(构造方法)构造方法:用来初始化对象的方法,是个对象方法。(以 -开头)
完整的创建了一个可用对象。
1,分配存储空间 ,+alloc 方法。
2,初始化 -init 方法。
[person new] 中 new 会调用以上两个方法创建,new方法是 alloc 和 init 的组合体。

分解步骤:1,调用+alloc 分配存储空间。
                     Person *p1 = [Person alloc];
                   2,调用 _init 进行初始化
                    Person *p2 = [Person init];
整合步骤: Person *p3 = [[Person alloc]  init ];
构造方法就是 init 方法。

重写构造方法的目的是:
        为了让对象创造出来的成员变量,就会有一些固定的值。

重写构造方法(init方法)的条件:
1,一定要调用super的init 方法[super init]:初始化父类中声明的一些成员变量和其他属性。
2,如果对象初始化成功,才有必要进行接下来的初始化。
3,返回一个已经初始化完毕的对象。

重写构造方法的注意点:
1,先调用父类的构造方法。[super init];
2,在进行子类内部成员变量的初始化。

构造方法(init方法)首先要调用alloc方法,返回好一个分配好内存的Person对象。[Person alloc];
然后再调用Person对象的init方法进行初始化。

父类声明的成员变量,实际上这些成员变量也存在于子类对象里边,只要你继承了某一个类,
父类里所有的成员变量你都能拥有。(继承关系)。

所有调用[super init]的目的,就是初始化父类中声明中的一些成员变量和其他属性。初始化完毕isa指针指向类。

[Person *p]  = [[Person alloc]  init ];
得到结论:任何对象先初始化父类的东西,在初始化自己。
什么是先初始化父类的东西:就是调用父类的init方法[super init];,返回一个初始化好的对象,其实就是self.

为保证oc中返回的对象与self一样,要进行一个赋值的操作(不要问为什么固定写法),self = [super init];
将右边的值赋值给左边,接下来做判断。
指针如果没有指向任何的空间,里边存储的就是0 ,或用oc中用nil 表示。
self其实就是个指针
if(self != nil)   如果self不等于空,就说明初始化成功。

init方法的写法:
- (id)init                                 一般用整合后的形式:        - (id)init
{                                                                                          {
     self = [super init];                                                                   if(self = [super init])
     if(self) self 为真                                                                        {
     {                                                                                                   _成员变量 = 赋值;
        _成员变量 = 赋值;
    }                                                                                                   }
    return self;                                                                                return self;
}                                                                                           }

解释:先调用super 的init方法,然后把值赋值给self,再看self值是否为0;

自定义构造方法:
自定义构造方法的规则:
1,一定是对象方法,一定以-开头。
2,返回值一般是id类型。
3,方法名一般以initWith开头。

@interface Person :NSObject
@property NSString* name;
- (id)initWithName:(NSString *)name
{
if (self = [super init])
    {
         _name = name;
    }
       return self;
}
@end
在  int main()
{
       Person *p = [[Person allco] init];
              p.name = @"Rose";      等价于[p setName:@"Rose"]  set方法 和点语法。
      NSLog(@"......");
      return ;
}
或者 Person *p = [[Person alloc] initWithName:@"Rose"]; 直接初始化完后直接赋值。

4 个回复

倒序浏览
楼主辛苦了。。
回复 使用道具 举报
神贴,学习中
回复 使用道具 举报
我来看看~
回复 使用道具 举报
写这么多,有辛苦分吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马