您的位置:首页 > 编程语言 > C语言/C++

黑马训练营--IOS学习---OC语言学习总结2

2014-10-28 07:54 706 查看
OC复习总结:

这个文件是在学习完C语言的基本用法后,回顾C语言的一些语法和易错,不易理解的一下内容,可能会存在内容不连续的情况.

本文内容,有参考自 M了个J的博客
和 lizze_yun的博客
根据自身的学习进行了部分的摘抄和扩写

原文请参考:http://www.cnblogs.com/mjios/tag/objective-c/default.html?page=1
http://blog.csdn.net/zhangyun2013?viewmode=contents
description方法

NSLog函数一旦发现用%@输出某个OC对象时,就会调用这个对象的description方法(这个方法返回值是NSString类型,是OC中的字符串类型),并且将description方法返回的字符串代替%@的位置进行输出

description方法的默认实现是返回这样的格式:<类名:
对象的内存地址>

<Student: 0x100109910>

每次NSLog函数发现用%@输出某个OC对象,会调用description方法,因此
我们可以通过修改description来改变输出的方式;

- (NSString *)description {

2
return [NSString stringWithFormat:@"age=%i", _age];

3 }

输出结果为:age=10

OC分类语法 Category:

分类的作用:在不改变原来类内容的基础上,可以为类增加一些方法

使用注意:

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

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

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

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

分类的应用:

在开发过程中一般都是给系统自带的类添加一些分类。

实例:

+ (int)numberCountOfString:(NSString *)str
{
//定义变量计算数字的个数
int count = 0;
for (int i = 0; i<str.length; i++)
{
unichar c = [str characterAtIndex:i]; // characterAtIndex 这个方法相当于遍历字符串,返回字符
if (c>='0'&& c<='9')
{
count++;
}
}
return count;
// return [str numberCount] // 如果同时有类方法和对象方法,那么就可以直接调用对象方法,不用再把算法写一遍了

}

同理,我们可以写出一个对象方法:

- (int)numberCount
{ //对象方法中,能用self表示的尽量用self表示 这样才能实现谁调用他
就是谁操作 避免与 //对象的耦合性过高
int count = 0;
for (int i = 0; i<self.length; i++)
{
unichar c = [self characterAtIndex:i]; // 当前对象调用方法

if (c>='0'&& c<='9')
{
count++;
}
}
return count;
}

@property int speed;这句话干了三件事。

1->.生成了一个private的_speed成员变量。

2->.声明了_speed的setter和getter方法。

3->.实现了_speed的set和get方法

缺点是自动生成的下划线成员变量是私有的,如果想要子类对象方法可以访问的话还需手动写出成员变量,编译器在编译过程中发现有成员变量就不会自动生成

@synthesize的细节

1.@synthesize age=_age;

setter和getter实现中会访问成员变量_age

如果成员变量_age不存在,就会自动生成一个@private的成员变量_age

2.@synthesize age;

setter和getter实现中会访问成员变量age

如果成员变量age不存在,就会自动生成一个@private的成员变量age

OC中的self既可以用在动态方法中,也可以用在静态方法中

动态方法:对象方法

静态方法:类方法

self总结

1> 在动态方法中,self代表着"对象"

2> 在静态方法中,self代表着"类"

3> 万变不离其宗,记住一句话就行了:self代表着当前方法的调用者

什么是空指针和野指针

1.空指针

1> 没有存储任何内存地址的指针就称为空指针(NULL指针)

2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0。

2.野指针

"野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针。野指针是非常危险的。

利用野指针发消息是很危险的,会报错。也就是说,如果一个对象已经被回收了,就不要再去操作它,不要再尝试给它发消息。

2> 利用空指针发消息是没有任何问题的,也就是说下面的代码是没有错误的:

[nil setAge:10];

super关键字

super的作用

1.直接调用父类中的某个方法

2.super处在对象中,那么就会调用父类的对象方法

super处在类方法中,那么就会调用父类的类方法

3.使用场合:子类重写父类的方法时想保留父类中的一些行为

比如 在dealloc函数中 需要先释放父类,或者在构造方法初始化成员变量的值时,也要将父类的成员变量值先进行初始化,保证 谁声明 谁初始化

多态:

void feed(Animal *a)
{
[a eat];
}

这个函数既可以接收 Cat类型的对象
也可以接收Dog等子类对象

Animal *a=[Dog new];

对于,上面这句话,系统会认为,a是一个animal类型的对象,但是实际上,执行过程中他所调用的方法都是Dog类型的

多态的局限性

不能访问子类的属性(可以考虑强制转换)

Animal *a=[Dog new];

//多态的一个限制:不能用父类指针调用子类方法

//[a run]; // 编译器警告

Dog *dd=(Dog *)a;//将a强制转为Dog*型的变量

[dd run];

SEL类型:

定义:typedef struct objc_selector*SEL;

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

[p test]; // 调用p的test方法

[p performSelector:@selector(test)] //
间接调用test方法

SEL对象的创建

SEL s =@selector(test);

SEL s2 = NSSelectorFromString(@"test");

SEL对象的其他用法

将SEL对象转为NSString对象

NSString *str =NSStringFromSelector(@selector(test));

_cmd代表当前方法,是SEL类型,相当于_cmd
= @selector(方法名);

所以根据这个方法,把_cmd传递进去,就可以得到当前方法的方法名了。

NSString *str = NSStringFromSelector(_cmd);

注意不可以在方法中这么写[self performSelector:_cmd];会引发死循环

因为_cmd代表当前方法,performSelector意思是执行当前方法,所以会引发死循环

当只知道方法名的字符串时可以通过下面的方法来调用方法

NSString *name =@"test";

SEL s =NSSelectorFromString(name); //
把字符串转为SEL类型数据

[p performSelector:s];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: