<1>OC中用get和set方法设置的属性获取与设置方法可以通过点语法来调用,调用格式为:
对象.对象变量
比如声明一个类Person
@interface Person:NSObject
{
int _age;
}
-(void)setAge:int age;//age属性的设置
-(int)age;//age属性的获取
@end
Person *p = [Person new];
p.age = 18;//调用setAge方法
NSLog(@“age = %d”,p.age);//调用age方法;
只有在类中声明了属性的get和set方法后,才可以使用对象的点语法。点语法调用属性的set还是get方法取决于点语法所在的具体位置,当获取时采用get方法,设置时采用set方法;
<2>通过@property关键字可以简洁的声明OC类中定义的属性。比如(1)中age属性的
声明可以采用下面的形式:
@interface Person:NSObject
@property int age;//相当于声明setAge和age方法。
@end
<3>@synthesize关键字OC中用来在类实现的.m文件中实现set和get方法。如(2)中,在.h中声明了age属性后,在.m文件中实现的方式为@ synthesize age。
通过@property和@synthesize关键字声明和实现的属性是类中的私有变量,在子类中不能继承。
可以通过@synthesize关键字指定在.h文件中定义的属性,如(1)中声明的_age属性可以在
.m文件中通过@synthesize age = _age语句指定_age变量,这样就相当于声明并实现了类_age属性的set和get方法;
在Xcode4.4之后,可以通过@property的增强方法省去.m文件中的@synthesize语句。比如:
@interface
@property int age;//相当于声明了_age属性并在.m文件中实现了@synthesize;
@end
在@property增强方法下可以重写get或者set方法,但是不能同时重写get和set方法。
<3>OC中当直到程序执行时才能确定的类型称为动态类型;当定义为特定类型的对象时称为静态
类型。
<4>OC中id类型表示通用类型,可以指向任何类的对象,被称为“万能指针”。由于NSObeject
类型是所有类型的父类,因此NSObject类型也可以指向所有对象,但是当调用方法时使用NSObject类型定义的对象会进行编译器的检查,而id类型定义的对象则不会。
OC中的instancetype类型也可以表示所有的对象,和id类型类似。
<4>由于OC中多态的存在,因此在调用父类和子类中的方法时常常需要类型的转换,为了避免
忘记类型转换的错误,可以通过OC中动态类型检测的方法。
-(BOOL)isKindOfClass:class obj;//对象是否是obj类或者其派生类,若是返回YES,否则返回NO
-(BOOL)isMemberOfClass:class obj;//对象是否是obj类,若是返回YES,否则返回NO
+(BOOL)isSubclassOfClass:class obj;//类是否是obj类的子类
也可以在调用方法前判断对象能否响指定方法
-(BOOL)respondsToSelector:SEL//对象能否调用某方法
其中:SEL类型是方法的标示,可以通过手动的方法把C语言中的方法封装成SEL类型。比如:
SEL si = @selector(run);//把run方法封装成SEL类型;
+(BOOL)InstancesRespondToSelector:SEL//类中有没有指定的SEL方法
<5>当通过respondsToSelector和InstancesRespondToSelector方法判断对象或者类可以响应某
方法后,可以应用响应方法的语句:
-(id)performSelector:SEL//响应SEL方法
-(id)performSelector: withObject: 响应带有参数的方法;
<6>OC中定义类对象时,类中初始化的方法称为类的构造方法,方法名是“init”,格式如下:
-(intstancetype)init;
当需要对类对象进行特定处理时,可以重写构造方法,其实现格式:
-(instancetype)init{
self = [super init];//防止父类初始化方法释放掉self指向的空间后申请新空间,造成self指向的
//空间地址不明确;
if(self){ 对类处理的语句};
return self;
}
还可以自定义构造方法:
-(instancetype)initWith:(形参类型) 参数名 and:(形参类型)参数名{
~~~~~~//类处理方法
}
使用自定义构造方法实例化对象时,需要用alloc函数声明。
以上知识点的实例如下:
#import <Foundation/Foundation.h>
@interface Person : NSObject
//定义属性
{
int _age;
NSString *_name;
}
//声明属性方法
-(void)setAge:(int)age;
-(int)age;
-(void)setName:(NSString *)name;
-(NSString *)name;
@end
#import <Foundation/Foundation.h>
@interface Person : NSObject
//定义属性
{
int _age;
NSString *_name;
}
//声明属性方法
-(void)setAge:(int)age;
-(int)age;
-(void)setName:(NSString *)name;
-(NSString *)name;
@end
#import <Foundation/Foundation.h>
#include "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new];//定义对象
p.age = 25;//调用set方法
p.name = @"朱开山";
NSLog(@"age = %d, name = %@",p.age,p.name);//调用get方法
}
return 0;
}
#import <Foundation/Foundation.h>
@interface Person : NSObject
//@property int age;
-(void)test;
@end
#import "Person.h"
@implementation Person
@synthesize age;
-(void)test{
}
@end
#import <Foundation/Foundation.h>
#include "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new];//定义对象
p.age = 25;//调用set方法
//p.name = @"朱开山";
NSLog(@"age = %d",p.age);//调用get方法
}
return 0;
}
#import <Foundation/Foundation.h>
@interface Animal : NSObject
-(void)eat;
@end
#import "Animal.h"
@implementation Animal
-(void)eat{
NSLog(@"动物再吃!");
}
@end
#import "Animal.h"
@interface Dog : Animal
-(void)run;
@end
#import "Dog.h"
@implementation Dog
-(void)run{
NSLog(@"狗在跑!");
}
@end
#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Animal *ani = [Dog new];//利用多态创建对象
SEL si = @selector(run);//
if ([ani respondsToSelector:si]) {
//[(Dog *)ani run];
[ani performSelector:si];
}
else
{
NSLog(@"方法不能调用");
}
}
return 0;
}
#import <Foundation/Foundation.h>
@interface Gun : NSObject
@property int bulleteCount;
-(void)shoot;
@end
#import "Gun.h"
@implementation Gun
-(void)shoot{
_bulleteCount--;
NSLog(@"枪在射击!剩余子弹%d",_bulleteCount);
}
@end
#import <Foundation/Foundation.h>
#import "Solider.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Solider *s1 = [Solider new];
[s1 shootByGun];
}
return 0;
}
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property NSString *name;
@property int age;
-(instancetype)initWith:(NSString *)name andAge:(int) age;
@end
#import "Person.h"
@implementation Person
-(instancetype)initWith:(NSString *)name andAge:(int) age;
{
if (self = [super init]) {
_name = name;
self.age = age;
}
return self;
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Student : Person
{
int _score;
}
@property int sno;
-(instancetype)initWith:(NSString *)name andAge:(int) age andSno:(int) sno;
@end
#import "Student.h"
@implementation Student
-(instancetype)initWith:(NSString *)name andAge:(int) age andSno:(int) sno{
self = [super initWith:name andAge:age];
if (self) {
_sno = sno;
}
return self;
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student *stu = [[Student alloc] initWith:@"周华健" andAge:50 andSno:01];
NSLog(@"name = %@,age = %d,sno = %d",stu.name,stu.age,stu.sno);
}
return 0;
}