黑马训练营--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];
这个文件是在学习完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];
相关文章推荐
- 黑马训练营--IOS学习---OC语言学习总结1
- 黑马训练营--IOS学习---OC语言学习总结3
- 黑马训练营--IOS学习---OC语言学习总结3
- 黑马训练营--IOS学习---OC语言学习总结1
- 黑马训练营--IOS学习---OC语言学习总结2
- 黑马训练营--IOS学习---OC语言学习总结4
- 【IOS 开发学习总结-OC-7.1】C 语言特性——函数
- 黑马训练营--IOS基础学习总结--C语言总结4
- 【IOS 开发学习总结-OC-7.2】C 语言特性——局部变量与全局变量
- 黑马训练营--IOS学习------C语言基础1
- 黑马训练营--IOS基础学习总结--C语言总结5
- 黑马训练营--IOS基础学习总结--C语言总结1
- 黑马程序员之ios学习总结——11 OC语言的内存管理1
- 黑马程序员之ios学习总结——10 OC语言的构造方法和分类
- ios 学习之OC语言总结1
- [黑马IOS自学第十一篇]OC语言基础,SELF关键字,面向对象概念,类学习多态,继承@property等
- 【IOS 开发学习总结-OC-7.3】C 语言特性——动态存储与静态存储
- 黑马训练营--IOS基础学习总结--C语言总结3
- [黑马IOS自学第十篇]OC语言基础,面向对象概念,类学习
- 黑马程序员——黑马IOS面试学习二:C语言语法总结——黑马 ios 技术博客