------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、点语法
在前面学到了set、 get方法带来的封装的好处,但在实际的开发过程中不是直接用[Person setAge]来设置age的值,而是用点语法。点语法跟set 和get方法有关,可方便其
他行业能够访问成员变量。编译器对点语法进程翻译并执行 本质还是转换为方法调用实质还是 set函数和get函数。
之前学习的 方法调用:
Student *stu = [Student new];
[stu setAge:100];
int age = [stu age];
利用点语法来对属性访问:
stu.age = 100;
int age = stu.age;
注意:
由于点语法与方法调用的作用一直,因此下面的代码会引发死循环
-(void) setAge:(int)age{
self.age = age;
}
- (int) age{
returnself.age;
}
二、成员变量的作用域
1.作用域类型:
@private:只能在当前类的对象方法中直接访问
@protected:可以在当前类以及子类的对象方法中直接访问
@public:任何地方都可以直接访问
@package:同一个“体系内”(框架)可以访问,介于@private和@public之间
注意:1.@interface中定义的成员变量默认是protected
2.@ implementation中定义成员变量默认是private
三、@property 和@systhesize关键字
之前学习的set和get这两种方法都要进行声明和实现,在开发过程中是一项非常浪费时间的无聊代码,因此在开发过程中可以使用@property 和@systhesize关键字来解决这个麻烦,它们可以让xcode自动生成set get方法的声明与实现。
1.@property可以自动生成seter geter 函数 的声明
之前的声明:-(void)setAge : (int)age;
现在用关键字声明代替:@property int age ;
2.@ sysnthesize可以生成seter geter函数的实现
用@synthesize age = _age;就可以代替
- (int)age{
return_age;
}
- (void)setAge:(int)age{
_age= age;
}
@sysnthesize注意:
1.@sysnthesize age=_age;会访问_age,即set get 都是访问的_age,如果_age成员变量没有声明不存在,就自动生成private类型的,则有时可以不用写成员变量的声明
2.@ sysnthesize age; 默认会访问age成员变量,那么setter和getter实现中会访问成员变量age,如果成员变量age不存在,就会自动生成一个@private的成员变量age
总结:
1.在使用这两个关键字时:若手动实现了setter方法,编译器就只会自动生成getter方法
若手动实现了getter方法,编译器就只会自动生成setter方法
若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量
2.在级别较高的编译器如Xcode4.4版本中可以只用@property类型,可以完成3个步骤,声明实现setter getter方法 ,定义成员变量_gae。它的原则是已经手动写的就用写的
getter setter函数,如果没有就用编译器自动生成的方法。若果s g 都有了那么就不会生成_age
四、id
id是一个指针类型,万能指针,能够指向任何OC对象
id==NSObject *
当id类型作为函数传入参数时,可以用任意类的对象作为参数
id类型的定义
typedefstructobjc_object {
Classisa;
} *id;
它的一个应用:(可以看出它可以指向任意类的对象)#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
@property id obj;
@end
person.h
import "Person.h"
@implementation Person
@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
void test(id d)
{
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [Person new];
//[p fsdfdsfd];
NSObject *o = [Person new];
id d = [Person new];
[d setAge:10];
[d setObj:@"321423432"];
NSLog(@"%d", [d age]);
}
return 0;
}
注意:
1.id调用不存在的方法编译器会马上报错
2.id后面不要加 *
五、SEL
SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法,把方法转换成sel类型的数据 然后去类中去寻找对应的方法
知识点:
1. 把方法转化为SEL类型 ,根据这个SEL类型找到方法地址,并执行这个方法
SEL s =@selector(test)
[p performSelector : s]
2.将方法的名称转化为sel类型并执行该方法
NSString *name = @"test2";
SEL s = NSSelectorFromString(name); //把方法名(即字符串)转化为SEL类型
[p performSelector:s];
3.每个方法中都有一个 _cmd :代表着当前方法的SEL , 下面的代码会引发死循环
- (void)test{
[self performSelector:_cmd];
}
利用_cmd可以打印当前方法的方法名字
NSString *str = NSStringFromSelector(_cmd);
NSLog(@"调用了test方法-----%@", str);