更改Xcode模板
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates。在Templates下有Templatesfile 和TemplatesProject
Category分类,类别,类目
//可以给某一个类扩充一些方法(不修改原来类的代码)
基本形式
//声明
@interface 类名(分类名称)
@end
//实现
@implementation 类名(分类名称)
@end
代码示例:
//不用继承,不改动Person类的情况下给Person增加一些方法
/*
分类的作用:在不改变原来内容的基础上。可以为类增加一些方法,
分类使用注意:
1,只能增加方法,不能增加成员变量,如果想添加变量,可以考虑通过继承创建子类
2,分类方法实现中可以访问原来类中声明的成员变量
3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法无法使用。不建议重写方法
4,方法调用的优先级:分类(最后参与编译的分类优先)--》原来类---》父类,多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效
5.在很多的情况下,往往是给系统自带的类添加分类,如NSObject和NSString,因为有的时候,系统类可能并不能满足我们的要求。
6.在大规模的应用中,通常把相应的功能写成一个分类,可以有无限个分类,对原有类进行扩充,一般分模块写,一个模块一个分类。
分类好处
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利于团队合作
*/
@interface Person :NSObject
- (void)test;
@end
@implementation Person
- (void)test
{
NSLog(@"---");
}
@end
@interface Person (MJ)
- (void)study;
@end
#import "Person+MJ.h"
@implementation Person (MJ)
- (void)study
{
NSLog(@"学习-----%d", _age);
}
- (void)test
{
NSLog(@"Person (MJ)-test");
}
@end
#import "Person+JJ.h"
@implementation Person (JJ)
- (void)test2
{
NSLog(@"-----test2");
}
- (void)test
{
NSLog(@"Person (JJ)-test");
}
@end
int main()
{
Person *p = [[Person alloc] init];
[p test];
[p test2];
p.age = 10;//
[p study];
// 优先去分类中查找,然后再去原来类中找,最后再去父类中找
return 0;
}
Category的练习
/*
给NSString增加一个类方法:计算字符串中阿拉伯数字的个数
给NSString增加一个对象方法:计算字符串中阿拉伯数字的个数
*/
#import <Foundation/Foundatition.h>
@interface NSString (Number)
+ (int)numberCountOfString:(NSString *)str;
- (int)numberCount;
@end
//@"adfasd1334zd"
@implemetation NSString (Number)
+ (int)numberCountOfString:(NSString *)str
{
//1.定义变量计算数字的个数
int count = 0;
for(int i = 0;i<str.length; i++)
{
unichar c = [str characterAtIndex:0];
//uichar就是 unsign char,characterAtIndex是NSString自带方法传递一个int类型参数.代表传递
字符串第参数个字符
if ( c>='0'&& c<= '9') //if (c>=48&& c<= 57)
{
count++;
}
}
return count;
return [str numberCount];
}
- (int)numberCount
{
int count = 0;
for (int i = 0;i<self.length;i++)
{
unichar c = [self characterAtIndex:i];
if ( c>='0'&& c<= '9') //if (c>=48&& c<= 57)
{
count++;
}
}
return count;
}
@end
int main()
// 类库 : 很多类的集合
{
int count = [NSString NumberCountOfString:@"sdf4546dfett"];
int count2 = [@"5sadf65dfeyh",count];
NSLog(@"%d,%d",count,count2 );
}
类的深入研究
(一)类的本质
类本身也是一个对象,是class类型的对象,简称“类对象”
Class类型的定义:
Typedef struct obj class *class;
类名就代表着类对象,每个类只有一个类对象。
利用class 创建 Person类
利用Person 创建Person类型的对象
Person *p=[[Person alloc] init];
获取内存中的类对象有两种方法:
(1)Person *p=[[Person alloc] init];
class c=[p claas];//指向类的对象的指针调用class方法,对象方法
(2)Class c1=[Person class];//使用类名调用class方法类方法
注意:c和c1打印出来的地址相同,class c2=[p claa];可以证明所有的对象共用一个类方法。
(二)类的加载和初始化
//当程序启动的时候,就会加载一次项目中所有的类。类加载完毕后就会调用+load方法
+ (void)load
{
NSLog(@"Person---load");
}
//当第一次使用这个类的时候,就会调用一次+initialize方法
+ (void)initialize
{
NSLog(@"Person-initialize");
}
@end
@implementation Student
//在类被加载的时候调用,重写方法
+ (void)load
{
NSLog(@"Student---load");
}
+ (void)initialize
{
NSLog(@"Student +initialize");
}
/*
1.当程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法。只会调用一次。
2.当第一次使用某个类时,就会调用当前类的+initialize方法
3.先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法)
4.先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法).注意:在初始化的时候,如果在分类中重写了+initialize方法,则会覆盖掉父类的。
5.重写+initialize方法可以监听类的使用情况。
*/
int main()
{
Person *p = [[Person alloc] init];
// [[GoodStudent alloc] init];
Person *p1 = [[Person alloc] init];
return 0;
}
---------------------- ASP.Net+Unity开发、 .Net培训、期待与您交流! ----------------------详细请查看: www.itheima.com
本文深入讲解了Objective-C中的分类概念,包括如何通过分类为现有类添加新方法而不修改原始代码,探讨了分类的使用限制及优势,并提供了具体的代码示例。

542

被折叠的 条评论
为什么被折叠?



