OC的弱语法、类方法、继承

一、OC的弱语法

1、OC是基于C语言的,其本质还是面向过程的
 1>.调用其不存在的方法编译是不会报错的,仅仅是警告,只有在链接的时候才会报错unrecognized selector sent to instance给XX对象发送了一个不能识别的消息
 2>.仅仅有声明没有实现时,编译也能通过,会给警告。OC是在运行过程中才会检测对象有没有实现相应的方法
 3>.当没有声明只有实现也能运行,不会报错,说明可以没有声明,可以这样写

@implementation Person: NSObject
{
}
@end
二、类方法
1、可以使用类方法提高性能
#import <Foundation/Foundation.h>
@interface Person : NSObject{
 int age;
}
+ (void)printClassName;
@end
@implementation Person
+ (void)printClassName{
NSLog(@"这个类叫做Person-%d", age);
}
@end
int main(){
[Person printClassName];//默认调用方法中以+开头的printClassName类方法
Person *p = [Person new];
[p printClassName];// 系统会认为现在调用以-开头的
printClassName对象方法
return 0;
}
1>.OC中允许下边的代码存在,因为方法类型不一样,可以允许类方法和对象方法同名
- (void)test;
+ (void)test;
2、对象方法
 1> 减号 - 开头
 2> 只能由对象来调用
 3> 对象方法中能访问当前对象的成员变量(实例变量)
 3> 类方法中不能访问成员变量(实例变量)
4、类方法的好处和使用场合
 1> 不依赖于对象,执行效率高
 2> 能用类方法,尽量用类方法
 3> 场合:当方法内部不需要使用到成员变量时,就可以改为类方法可以允许类方法和对象方法同名
#import <Foundation/Foundation.h>
@interface JiSusnQi : NSObject// 工具类:基本没有任何成员变量,里面的方法基本都是类方法
+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;
+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;
@end

@implementation JiSusnQi
+ (int)sumOfNum1:(int)num1 andNum2:(int)num2{
return num1 + num2;
}
+ (int)averageOfNum1:(int)num1 andNum2:(int)num2{
int sum = [JiSusnQi sumOfNum1:num1 andNum2:num2];
return sum / 2;
@interface JiSusnQi : NSObject// 工具类:基本没有任何成员变量,里面的方法基本都是类方法
+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;
+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;
@end
@implementation JiSusnQi
+ (int)sumOfNum1:(int)num1 andNum2:(int)num2{
return num1 + num2;
}
+ (int)averageOfNum1:(int)num1 andNum2:(int)num2{
int sum = [JiSusnQi sumOfNum1:num1 andNum2:num2];
return sum / 2;
@implementation JiSusnQi
+ (int)sumOfNum1:(int)num1 andNum2:(int)num2{
return num1 + num2;
}
+ (int)averageOfNum1:(int)num1 andNum2:(int)num2{
int sum = [JiSusnQi sumOfNum1:num1 andNum2:num2];
return sum / 2;
@end
int a = [JiSusnQi averageOfNum1:17 andNum2:24];
NSLog(@"a=%d", a);
JiSusnQi *jsq = [JiSusnQi new];
[jsq sumOfNum1:11 andNum2:17];
return 0;
}
如果程序陷入死循环,按Ctrl+C强制退出
四、访问成员变量
1、使用self访问成员变量,指向方法调用者的当前对象的成员变量self->_age=age;
2、使用self调用其他对象方法或者类方法[self run];//run是对象的方法名
3、self无论访问谁,都可以看成把self换为谁,不论是对象方法或者是类方法

五、面向对象三大特性之继承
1、类B和类A具有相同的成员变量,把A和B相同的属性,
#import <Foundation/Foundation.h>
/********Animal的声明*******/
@interface Animal : NSObject{
int _age;
double _weight;
}
- (void)setAge:(int)age;
- (int)age;
- (void)setWeight:(double)weight;
- (double)weight;
@end
/********Animal的实现*******/
@implementation Animal
- (void)setAge:(int)age{
_age = age;
}
- (int)age{
return _age;
}
- (void)setWeight:(double)weight{
_weight = weight;
}
- (double)weight{
return _weight;
}
@end
/********Dog*******/
// : Animal 继承了Animal,相当于拥有了Animal里面的所有成员变量和方法
// Animal称为Dog的父类
// Dog称为Animal的子类
@interface Dog : Animal
@end
@implementation Dog
@end
/********Cat*******/
@interface Cat : Animal
@end
@implementation Cat
@end
int main(){
Dog *d = [Dog new];
[d setAge:10];
NSLog(@"age=%d", [d age]);
return 0;
}

继承示意图:

继承的好处

1> 抽取重复代码
 2> 建立类之间的关系
 3> 子类可以拥有父类中的所有成员变量和方法
使用注意:
 1>.基本上所有类的根类是NSObject也有例外 
 2>.OC中不允许子类和父类拥有相同名称的成员变量
 3>.重写:子类重新实现父类的某个方法,覆盖父类以前的做法
 4>.父类必须声明在子类的前面

 4、继承的使用场合
 1>.当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取
到一个父类中
 2>.当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承
A类
5、组合
格式:A*_a//*代表拥有的意思

6、关键字super
[super run];直接调用父类的run对象方法/类方法,具体是调用对
象方法还是类方法,取决于当前调用所处的环境,应该是同样的类型






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值