——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一、编译器特性:点语法
点语法是OC为帮助其他语言程序员迅速掌握和适应OC来创造的语法,点语法的本质为set和get方法的调用,例如:
`int main(int argc, const char * argv[]) {
Person *p = [Person new];
//点语法:此处点相当于调用set方法,将值set进成员变量
p.age = 10;
//点语法:此处相当于调用get方法,将值取出
int a = p.age;
return 0;
}`
注意:即使有了点语法,set和get方法必须要有才能正确编译和执行,因为点语法的本质是set和get方法。
二、成员变量的作用域:
1> @public:在任何地方都能直接访问的成员变量;
2> @private:只能在当前类的对象方法中直接访问的成员变量;
3> @protected:能在当前类和其子类的对象方法中直接访问的成员变量;
当什么都不写的时候,默认成员变量是protected。
三、编译器特性:@property和@synthesize:
1> @property:自动生成某个成员变量的set和get方法声明,如:@property int age;自动生成_age变量的set和get方法声明。
2> @synthesize:自动生成某个成员变量的set和get方法实现,如:@synthesize age = _age;自动生成_age变量的set和get方法实现。
注意点:
1> 上述@synthesize语句会访问_age这个成员变量,如果不存在,就会自动生成这个成员变量;
2> Xcode4.4版本以后,@property可以自动生成成员变量的set和get方法声明、成员变量的set和get方法实现并且自动声明带有下划线的成员变量,但是成员变量的作用域为private;
3> @synthesize age = _age语句如果不写=后面的部分,会默认访问age变量而不是_age;
4> 只会在没有set或get方法的时候生成,如果代码中定义了set或者get方法,则只会生成缺少的那个方法,如果两个方法都有了,则什么都不会生成,包括成员变量;
四、id
id是一种变量类型,即id为关键字之一,id是万能指针,可以指向/操作任何OC对象,相当于NSObject *。
五、构造方法
构造方法init是用来初始化对象时调用的方法,是对象方法,重写构造方法的注意点有:
1> 一定要调用父类(super)的init方法,用以初始化在父类中定义的成员变量和其他属性;
重写init方法实例:
//重写init方法,构造方法
- (id)init
{
if(self = [super init])
{
_age = 10;
_no = 1;
}
return self;
}
调用构造方法实例:
#import
#import "Person.h"
int main(int argc, const char * argv[]) {
Person *p = [[Person alloc] init];//使用构造方法创建类的对象
NSLog(@"age = %d,no = %d", p.age, p.no);
return 0;
}
2> 自定义构造方法,规范有:
①一定是对象方法;
②返回值一般是id类型;
③方法名一般以init开头;
//自定义构造方法
- (id)initWithAge: (int)age andNo: (int)no
{
if(self = [super init])
{
_age = age;
_no = no;
}
return self;
}
六、分类语法,category
分类为OC中特有的语法,可以给某一个类扩充一些方法,并且不改变原来类的代码。使用注意:
1> 分类只能增加方法,不能增加成员变量;
2> 分类中方法实现可以访问原来类中声明的成员变量;
3> 分类可以重新实现原来类中的方法,但是会重新覆盖掉原来的方法,导致原来的方法永远无法访问到,所以不建议这么做;
4> 方法调用的优先级:分类中的方法(最后编译的分类要高于前面编译的分类)–>类中的方法–>父类中的方法;
分类的写法参照下述小例子:
//分类的声明
#import "Person.h"
@interface Person (sdz)
- (void)study;
@end
//分类的实现
#import "Person+sdz.h"
@implementation Person (sdz)
-(void)study
{
NSLog(@"-----------");
}
@end
七、类的本质
1> 类本身也是一种对象,是Class类型的对象,简称类对象。
#import
#import "Person.h"
int main(int argc, const char * argv[]) {
Person *p1 = [[Person alloc] init];
Person *p2 = [[Person alloc] init];
Person *p3 = [[Person alloc] init];
//获取内存中的类对象(第一种方式)
Class c1 = [p1 class];
Class c2 = [p2 class];
Class c3 = [p3 class];
//获取内存中的类对象(第二种方式)
Class c4 = [Person class];
//c1\c2\c3\c4都指向内存中person类对象,地址相同
NSLog(@"%p, %p, %p, %p", c1 ,c2, c3, c4);
//拿到类对象后(即c1、c2、c3、c4)可以调用类方法
[c1 test];
return 0;
}
2> 当程序启动时,会将程序中所有的类都加载一次,类加载完毕后就会调用一次+ (void)load方法,先加载父类,再加载子类;
3> 当程序第一次使用这个类的时候,就会调用一次+ (void)initialize方法;
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-