Objective-C 构造方法 分类 类的深入研究

构造方法

1.对象创建的原理

new的拆分两部曲

Person *p = [Person alloc]; 分配内存(+alloc)

Person *p = [p init]; 初始化(-init)

合并: Person *p = [[Person alloc] init];

2.init方法的重写

- (void) init {
    if(self = [super init]) {
        _age = 10;//想在对象创建完毕后 成员变量马上就有一些默认的值
    }
    return self;
}

3.自定义构造方法

/** 自定义构造方法一 **/
- (id) initWithAge : (int) age {
    if(self = [super init]) {
        _age = age;
    }
    return self;
}

/** 自定义构造方法二 **/
- (id) initWithAge : (int) age andNo : (int) no {
    if(self = [super init]) {
        _age = age;
        _no = no;
    }
    return self
}

/** 注意 **/
//返回值是id类型
//方法名都以init开头

分类

Category

可以给一个类扩充一些方法(不修改原来的代码)

#import "Person.h"

@interface Person (Hy)
- (void) show;
@end

/** 声明 **/
//@interface 类名 (分类名称)
//@end
#import "Person+Hy.h"

@implementation Person (Hy)
- (void) show {
    NSLog(@"哈哈哈~~!");
}
@end

/** 实现 **/
//@implementation 类名 (分类名称)
//@end

使用注意:

分类只能增加方法 不能增加成员变量

分类方法实现中可以访问原来类中声明的成员变量

分类可以重新实现原来类中的方法 但是会覆盖掉原来的方法 会导致原来的方法没法再使用

方法调用的优先级: 分类(最后参与编译的分类优先) ---> 原来类 ---> 父类

类的深入研究

类本身也是一个对象 是Class类型的对象 简称类对象

Person *p = [[Person alloc] init];

Class c = [p class];

[c test];//c是可以调用 Person里面的类方法

类的加载和初始化:

当程序启动时 就会加载项目中所有的类和分类 而且加载后会调用每个类和分类的+load方法 只会调用一次

当第一次使用某个类时 就会调用当前类的+initialize方法

先加载父类再加载子类(先调用父类的+load方法 再调用子类的+load方法) 先初始化父类再初始化子类(先调用父类的+initialize方法再调用子类的+initialize方法)

时间: 2024-10-13 02:37:35

Objective-C 构造方法 分类 类的深入研究的相关文章

Objective-C语言-构造方法和类的深入和分类

一.构造方法 (一)构造方法的调用 完整的创建一个可用的对象:Person *p=[Person new]; New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法来分配存储空间(返回分配的对象):2)使用init方法来对对象进行初始化. 可以把new方法拆开如下: 1.调用类方法+alloc分配存储空间,返回未经初始化的对象 Person *p1=[person  alloc]; 2.调用对象方法-init进行初始化,返回对象本身 Person *p2=[p1 init];

「OC」类的深入研究、description方法和sel

一.类的深入研究 (一)类的本质 类本身也是一个对象,是class类型的对象,简称“类对象”. Class类型的定义: Typedef struct obj class *class; 类名就代表着类对象,每个类只有一个类对象. 利用class 创建 Person类 利用Person 创建Person类型的对象 Person *p=[[Person alloc] init]; 获取内存中的类对象有两种方法: (1)class c=[p claa];//指向类的对象的指针调用class方法 (2)

分类 类扩展 继承 协议 委托

分类 类扩展 继承 协议 委托 分类(Category) 不产生新类,不修改原类,但有自己的.h和.m文件 分类只能向原类中增加方法,或者重写原类的方法 声明的@property只会生成getter setter方法的声明 类.h中定义的方法必须实现,但分类.h中定义的方法,可以不实现 同名方法,分类的优先级高类别主要有3个作用:(1)将类的实现分散到多个不同文件或多个不同框架中.(2)创建对私有方法的前向引用.(类.h中未声明,但存在于.m中的私有方法,通过在分类.h中声明一下,就可以在其他类

OC category (分类,类目),日期类常用用法

学了这么久OC我们都知道OC中的类分为系统类和自定义的类,当我们在使用系统为我们提供的类时有时往往不能满足我们的需要,例如,字符串NSString类提供了比较字符串的方法compare,为数组排序时系统默认的是升序,当需要为数组按降序排序时,一种途径是需要新建一个类写一个降序的方法,而另一个途径就是系统提供的category(分类,类目),分类(类目,category)的目的为了给没有源代码的类添加方法(只能添加方法,不能添加实例变量),是扩充一个类功能的方式之一,为原有类扩充的方法会成为原类的

为什么如果待分类类别是10个,类别范围可以设置成(9,11)

为什么如果待分类类别是10个,类别范围可以设置成(9,11) 11的解释:有一个背景分类的过程 9的解释是:? 这个主要看损失函数设计对于类别的解释性 原文地址:https://www.cnblogs.com/miaozhijuan/p/12578515.html

iOS开发核心语言Objetive C —— 编译器指令@[email protected]自定义构造方法及类工厂

本分享是面向有意向从事iOS开发的伙伴们,或者已经从事了iOS的开发者.如果您对iOS开发有极高的兴趣,可以与我一起探讨iOS开发,一起学习,共同进步.如果您是零基础,建议您先翻阅我之前分享的iOS开发分分钟搞定C语言系列,然后在开始Objective C语言的学习,如果您遇到问题也可以与我探讨,另外将无偿分享自己整理的大概400G iOS学习视频及学习资料,都是干货哦!可以新浪微博私信?关注极客James,期待与您的共同学习和探讨!!由于时间有限,每天在工作之余整理的学习分享,难免有不足之处,

构造方法、类初始化

请看下面代码,无法通过编译,问题出在那? package demo; public class Test { public static void main(String[] args){ Foo obj1=new Foo(); } } class Foo( ){ int value; public Foo(int initValue){ value=initValue; } } 你可以得到什么结论? 结论:如果类提供一个自定义的方法,系统将不再提供默认方法. JAVA字段初始化规律: 如果一个

0422 多线程下载(分类/类扩展)/封装mySdWebImage

1. 创建分类 Source - OC Files - 选择UIImageView创建分类(category) 2. 在分类中创建一个对象方法: 分析分类需要做什么,需要什么参数? 1) 分类需要获得url,从而下载图片 2) 分类需要传进来一个图片,作为placeholder 所以,定义一个方法: -(void)my_SdWebImageWithUrl:(NSURL*)url placeholder:(UIImage*)placeholder; 3. 把创建线程的方法从原先的ViewDidLo

无限分类类实现可折叠导航实例(推荐)

废话不多说,直接贴代码. 1,数据库 2,函数 function get_str($id = 0) { global $str; $m = M("Category","sp_","DB_CONFIG1"); $result = $m->where(array("pid"=>$id))->select();//查询pid的子类的分类 if($result){//如果有子类 $str .= '<ul>