------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
(1)弱语法
#inport<Foundation/Foundation.h>
//声明
@interface Person :NSObject
@end
@implementation JiSuanQi
@end
int main()
{
Person *p = [Person new];
[p test];
return 0;
}
输出结果:编译时会有警告,但连接时会报错
-[Person test]:unrecognized selector send to instname
解析:给Person对象发送了一个不能识别的消息:test
2.若在@interface与@end之间加一条声明:-(void)test;即只有方法的声明,没有实现
输出结果:编译时会有警告,连接时会通过,但运行时会崩溃(这样在手机上会闪退,黑屏)。
所以,在OC运行过程中才会检测对象有没有实现相应的方法。
3.若只在@implementation与@end之间加一句实现:
-(void)test
{
NSLog(@"哈哈");
}
即没有声明,只有实现
输出结果:编译时没有警告,链接时也没有问题,运行时输出哈哈
但须有一个前提条件:实现必须在main函数之前
(2)类对象
1.设计一个Person类
#inport<Foundation/Foundation.h>
@interface Person :NSObject
//类方法都是以+开头
+(void)printClassName;
-(void)test;
@end
@implementation Person
+(void)printClassName
{
NSLog(@"这个类叫Person");
}
-(void)test
{
NSLog(@"调用了test方法");
}
@end
int main()
{
[Person printClassName];
return 0;
}
输出结果:这个类叫Person
2.把main函数改为:
int main()
{
[Person printClassName];
Person *p = [Person new];
//对象调用类方法
[p printClassName];
return 0;
}
输出结果编:编译链接有警告,运行时有错
-[Person printClassName]:unrecognized selector send to instance
因为用对象指针P调用printClassName,所以会从对象中找以-开头的printClassName
对象方法,所以会找不到,于是报错。
3.把main函数改为
int main()
{
//类调用对象方法
[Person test];
}
输出结果:编译警告,运行出错,和2中报一样的错误
4.若增加一个成员变量:
@interface
int age;
@end
把+(void)test改为:
{
NSLog(@"%d",age);
}
main函数改为:
int main()
{
[Person test];
}
输出结果:error:instance variable 'age' accessed in class mothd
即:实例变量age不能在类方法中访问
总结:
1.类调用以+开头的类方法 [Person test]
2.对象调用以-开头的对象方法 Person *p = [Person new];
[p test];
3.允许类方法与对象方法同名
-(void)test
{
NSLog(@"111");
}
-(void)test
{
NSLog(@"222");
}
4.类方法中不能访问实例(成员)变量,成员变量只能由对象方法访问。
5.类方法的好处:
1>不依赖于对象,执行效率高
2>能用类方法尽量用类方法
3>适用场合:当方法内部不需要使用成员变量时,可改为类方法