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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

基础知识(分类)分类(categroy)
分类的作用:
       在不改变原来类模型的基础上,给某个类扩充一些方法。( 不修改原来代码)
分类格式:
       声明:@interface 类名 (分类名称)
                   一个类可以拥有很多分类,在分类名称中区别。
                  @end
        实现:@implementation 类名 (分类名称)
                   @end
把不同功能的方法 ,写到不同的分类里面,一个分类写一中功能。

分类名称一般以模块命名,不是以作者命名。

分类的使用注意:
1,分类只能增加方法,不能扩充成员变量。
2,分类方法的实现里面可以访问原来声明的成员变量。
3,分类可以重新实现原来类中的方法,但是会覆盖原来的方法,导致原来的方法失效,原来方法无法使用。
4,分类的优先级:调用方法先去分类中找,然后去原来的类中找,没有再去父类中找。一级一级往上找。
5,最后参与编译的分类优先,看编译的顺序,最后编译的文件会覆盖前面编译文件。

分类的应用:(用在系统自带的类上面)
给系统自带的NSString 添加一个类方法:
计算某个字符串中阿拉伯数字的个数?
一般把分类的作用当做分类的名称
题目意思 @“agfdsfsdf123344566sfsdf" 计算数字的个数
要求:给NSString增加一个类方法。
@interface NSString(number)
+ (int)numberCountOfSting:(NSString *) str;
@implementation NSString(number)
+ (int)numberCountOfString:(NSString *) str
int count = 0;
for(int i = 0;i <str.length;i++)
{
uni char c = [str characterAtTndex: i];
   if(c >= "0" && c <= "9")
   {
       count++;
   }
}
retrun count;              在类方法中调用对象方法:return [str numberCount]; 一个方法解决两个方法。
}
int main()
{
        int count = [NSString  numberCountOfSting:@"afsfsfsdf131313sfsf"]
        NSLog(@“%d.count”);

}

同样的题目,给NSString增加一个对象方法。
声明:- (int) numberCount; 对象方法不屑谁的,他自己的,后边也没有谁的字符串。
实现:
- (int)numberCount
{
int count = 0;
for(int i = 0; i <self.length;i++)
{
unichar c = [self characterAtTndex:i];
if (c>="0" &&c<="9")
{
count++;
}
return count;
}
}
int main()
{
int count = [@"sfsfsfs1313f13s1g3ssf",numberCount];
NSLog(@"%d\n",count);
}

类的深入研究 (类也是一个对象)
类的本质也是一个对象是class的对象
一个类在内存中,只有一块储存空间,这块储存空间称之为类对象。
class类型对象 创建对应类型的另一种 类对象,利用类对象创建出这个类。  类与类对象是等价的。

获取类对象的两种方式:
类方法:class c = [person class]l
              
对象方法: Person *p = [Person new]
            class c2 = [p class]

拿到类对象有什么作用:
[p class] 获取到了内存中的类对象,有了类对象就能调用类方法。[c class];

类对象的使用:
每次创建对象首先都会把类对象创建好,加载内存,在利用类对象创建某一个类型的对象。
Person *p = [[Person alloc] init];
class c = [p class];
利用Person类型,对象p的class方法,能获取我们这个类对象
指针c 就是获取的内存中的类对象。

还可以这样创建对象:
Person *p2 =[(c new) init] =[(person new) init];

类的加载过程:
当程序已启动是会把所有的类搞进来加载一次,先加载父类在加载子类。

怎样验证是否加载了:
只要加载了这个类,就会调用类的一个 + Load方法,是个类方法,比较深层的一个方法。
只要这个类加载完毕后,系统会自动调用 +Load方法,而且类只会被加载一次。
+ (void)load
{
     NSLog(@"我被调用了");
}

main函数虽然没有用到这个类,但类的有些东西还是会被加载。做一个简单的加载。

我想知道你有没有使用者个类,用+Load方法,因为只要在调用这个类,就会先加载,只要加载系统就会自动调用+Load方法 监听这个类的加载过程。
比如:
int main()
{
  [[student alloc] init];
}
调用student 这个类时 会进一步的加载,加载完了,会调用另一个方法叫initlalize方法 。
+(void)initlalize
{
   Nsl(@"student --initlalize");
}
当程序一启动时,就会加载一次项目中所有的类和分类,这个类加载完毕后就会调用+Load方法。只会加载一次。
当第一次使用这个类的时候,就会调用一次initlalize方法,而且,不管你是load还是initlalize都是先搞父类在到子类。
initlalize用到这个类调用的,用不到不调用。

分类也要加载 + load方法 不用也不用加载。
+initlalize方法会选择调用分类,不调用本类的+initlalize.如果分类没有 ,就去本类中找,本类中在没有去父类中找。
层层往上。
initlalize是初始化的意思。

重写这个类的initialize方法, 在+(void)initialize里面写上我们第一次使用类时想做的事情。利用这个方法可以监听这个类在什么时候可以被使用,这就是所谓的监听。
类第一次调用+initialize方法,监听类的初始化过程,知道类在什么时候被使用

8 个回复

倒序浏览
Person *p2 =[(c new) init] 这里括号写错了,我还不明白视频里这里老师为什么不写成这样Person *p2 =[[c alloc] init]
回复 使用道具 举报
学习了:victory:
回复 使用道具 举报
谢谢分享,学习了!
回复 使用道具 举报
朱亚男 发表于 2014-8-23 23:20
Person *p2 =[(c new) init] 这里括号写错了,我还不明白视频里这里老师为什么不写成这样Person *p2 =[[c a ...

记得在视频里讲过,能用alloc尽量不要用new,估计new有什么缺陷吧,就像能用fgets尽量不要用gets一样
回复 使用道具 举报
总结得不错
回复 使用道具 举报
SailY 发表于 2014-8-24 09:02
记得在视频里讲过,能用alloc尽量不要用new,估计new有什么缺陷吧,就像能用fgets尽量不要用gets一样 ...

视频里这里用的new之后又用init,不知道什么情况呢?
回复 使用道具 举报
那个视频 我还有点印象 大概是 等价的意思 有点 记不清了 ,不要紧 那个不重要 只要记住[Person new]
以后 全用 [[Person alloc] init] 就没错 了
回复 使用道具 举报
   楼主辛苦了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马