1. 初始化结构体属性
typedef struct{
int year ;
int month ;
int day ;
}Date ;
stu ->_birthday = (Date ){1980,1,12} ;
定义一个新的结构体, 给新结构体赋值, 再把新结构赋值给目标结构体
Date d = {1981,1,12} ;
stu->_birthday = d;
stu ->_birthday.year = 1981 ;
stu ->_birthday.month = 1 ;
stu ->_birthday.day = 12 ;
Date d1 = {1999,1,19} ;
Date d2;
d2 = d1
这么写的本质, 是将d1所有的属性的值都拷贝了一份, 赋值给d2
2. 匿名对象
匿名就是没有名字, 匿名对象就是没有名字的对象 有名字的对象
只要用一个指针保存了某个对象的地址,我们就可以称这个指针为某个对象
例如: p是Person 对象
Person *p = [Person new]
p->_age = 30 ;
p->_name = @"henry" ;
[p say];
无论有没有名字, 只要调用new 方法都会返回对象的地址
每次new 都会开辟一块存储空间
[Person new ]-> _age = 30 ;
[Person new ]-> _name = @"peter" ;
[[Person new ]say];
Iphone *phone = [Iphone new ];
[phone brand];
[[Iphone new ]brand];
Person *p1 = [Person new ];
[p1 signal :[Iphone new ]];
3. 修改项目模板
模版信息
修改项目模版以及main函数中的内容
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/Project Templates/Mac/Application/Command Line Tool.xctemplate/ 修改OC文件头部的描述信息
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File Templates/Source/Cocoa Class.xctemplate
4. Xcode文档安装位置
Xcode文档安装的位置一:
/Applications/Xcode.app/Contents/Developer/Documentation/DocSets 注意: 拷贝之前最好将默认的文档删除, 因为如果同时存在高版本和低版本的文档, 那么低版本的不会显示 Xcode文档安装的位置二:
/Users/你的用户名/Library/Developer/Shared/Documentation/DocSets 如果没有该文件夹可以自己创建一个
5. 封装的基本概念
概念: 屏蔽内部实现的细节, 仅对外提供共有的方法/接口 好处: 保证数据的安全性 , 将变化隔离 规范: 一般情况下, 不会对外直接暴露成员变量, 都会提供一些共有的方法进行赋值
6. getter-setter方法
getter方法
作用: 获取成员变量的值 getter方法一定是对象方法 一定有返回值,而且返回值一定和获取的成员变量的类型一致 方法名称就是获取的成员变量的名称去掉下划线 一定没有参数 格式:
-(int )size {
return size ;
}
setter方法
作用: 设置成员变量的值 优点: 监听属性变化 一定没有返回值 一定以set开头, 并且set后面跟上需要设置的成员变量的名称去掉下划线, 并且首字母大写 一定有参数, 参数类型一定和需要设置的成员变量的类型一致, 并且参数名称就是成员变量的名称去掉下划线
- (void)setSize:(int )size {
_size = size ;
}
7. 点语法
如果给属性提供了getter和setter方法, 那么访问属性就又多了一种访问方式 , 点语法 点语法其实它的本质是调用了我们的setter和getter方法 点语法是一个编译器的特性, 会在程序翻译成二进制的时候将.语法自动转换为setter和getter方法 如果点语法在=号的左边, 那么编译器会自动转换为setter方法 如果点语法在=号的右边, 或者没有等号, 那么编译器就会自动转换为getter方法 注意点: 点语法一般用于给成员变量赋值, 如果不是给成员变量赋值一般情况下不建议使用, 但是也可以使用
8. self
self怎么用
类方法中, 使用self可以直接调用类方法 ( 此时, self == 类名) 类方法中, 不能直接使用self调用对象方法 类方法中, self不能访问成员变量 self是谁
如果self在对象方法中, 那么self久代表”调用当前对象方法的那个对象” 如果self在类方法中, 那么self就代表”调用当前类方法的那个类” self的注意事项
self不能离开类, 离开类之后没有任何意义 self会自动区分类方法和对象方法, 如果在类方法使用self 调用对象方法, 那么会直接报错 不能在对象方法或者类方法中利用self调用当前self所在的方法 self的使用场景
可以用在对象方法之间互相调用 可以用在类方法之间互相调用 可以用在区分成员变量和局部变量同名的情况
9. 继承
继承, 可以解决重复代码太多的问题 A类继承了B类, A类就是B类的子类. B类就是A类的父类(或称 “超类”). A类会拥有B类的所有属性和方法(包含对象方法和类方法) 继承的语法:
@interface 类名 : 需要继承的类 例如 @interface UIView : NSObject 继承的其他特性
如果子类中有和父类中同名的方法, 那么我们称之为方法重写 注意:继承中的方法调用顺序, 如果自己有就调用自己的, 如果自己没有就调用父类的 方法的调用顺序, 先自己再父类, 如果父类中没有再爷爷类, 如果爷爷类再没有就找爷爷的爸爸类 如果一直找到NSObject类都没有找到, 那么就会报错 reason: ‘-[Iphone signalWithNumber:]: unrecognized selector sent to instance 0x1003043c0’ 在继承中除了对象方法可以重写, 类方法也可以重写 继承的优点
提高代码的复用性 可以让类与类之间产生关系. 正是因为有了这个(继承)关系, 才有了多态 注意:继承需要满足一定条件, 才适合使用.
条件: XXXX 是 XXX / 某某某 is a 某某某 继承的缺点
10. super
只需要利用super给父类的方法发送一个消息, 那么系统就会自动调用父类的方法 如果以后想在子类中调用父类的方法可以使用super 如果想在给父类方法进行扩展的同时保留父类的方法, 那么可以使用super调用父类同名的方法 super在类方法中, 一定会调用父类的类方法 super在对象方法中, 一定会调用父类的对象方法 可以利用super在任意方法中调用父类中的方法
11. 多态
什么是多态? - - - 事物的多种表现形态 在程序中如何表现 - - - 父类指针指向子类对象 优点 - - - 提高了代码的扩展性 注意点 - - - 如果父类指针指向子类对象, 如果需要调用子类特有的方法, 必须先强制类型转换为子类才能调用
12. 实例变量修饰符
@public就是实例变量修饰符 @public
可以在其它类中访问被public修饰的成员变量 可以在本类中访问被public修饰的成员变量 可以在子类中访问父类中被public修饰的成员变量 @private
不可以在其它类中访问被private修饰的成员变量 不可以在子类中访问父类中被private修饰的成员变量 可以在本类中访问被private修饰的成员变量 @protected
不可以在其它类中访问被protected修饰的成员变量 可以在本类中访问被protected修饰的成员变量 可以在子类中访问父类中被protected修饰的成员变量 注意: 默认情况下所有的实例变量都是protected @package
介于public和private之间的 如果是在其它包中访问那么就是private的 如果是在当前代码所在的包种访问就是public的 实例变量修饰符作用域: 从出现的位置开始, 一直到下一个修饰符出现 如果没有遇到下一个实例变量修饰符, 那么就会修饰后面所有的实例变量
13. description
应用场景
只要利用%@打印某个对象, 系统内部默认就会调用父类的description方法 可以重写description方法, 返回我们需要打印的内容 只要利用%@打印对象, 就会调用description 如果打印的是对象就会调用-号开头的description方法 如果通过%@打印对象就会调用-号开头的 如果通过%@打印类对象就会调用+号开头的 建议
建议: 在description方法中尽量不要使用self来获取成员变量\ 因为如果你经常在description方法中使用self, 可能已不小心就写成了 %@, self 如果在description方法中利用%@输出self会造成死循环 调用该方法, 该方法会返回一个字符串, 字符串的默认格式 <类的名称: 对象的地址> %@是用来打印对象的, 其实%@的本质是用于打印字符串 class注意c是小写, 只要给类发送class消息, 就会返回当前类的类对象
1 .获取Person 对应的类对象
Class c = [Person class ];
2 .打印Person 的类对象
NSLog (@"当前对象对应的类 = %@" ,c);
NSLog (@"当前对象的地址 = %p" ,c);