//
// main.m
// oclearn
//
// Created by SUMA on 15-7-18.
// Copyright (c) 2015年 SUMA. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Students.h"
#import "Person.h"
#import "Property.h"
#import "Teahcer.h"
#import "RetainRelease.h"
#import "MemBetweenObj.h"
#import "CategoryStudent+Test.h"
#import "Button.h"
#import "ButtonListener.h"
typedef int(^MySum) (int,int);
void test(){
int (^Sum)(int,int) = ^(int a,int b){
return a+b;
};
int a = Sum(10,11);
NSLog(@"%i",a);
}
void test2(){
MySum sum = ^(int a,int b){
return a+b;
};
NSLog(@"%i",sum(10,10));
}
void changeC(char *d){
*d = 9;
}
#pragma mark 字符串导出
void stringExport(){
NSString *str = @"123456我是字符串!!!!!!!!!!!";
NSString *path = @"/Users/suma/Desktop/text.txt";
NSString *error;
//YES代表要进行原子性操作,也就是会创建一个中间临时文件
//该方法当文件架不存在时会报错,但是当文件夹存在而文件不存在时会自动创建文件
//编码不对的时候也会报错
[str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (error) {
NSLog(@"写入失败:%@",error );
}else{
NSLog(@"写入成功");
}
}
#pragma mark 可变字符串的创建
void stringCreate(){
NSMutableString *str = [[NSMutableString alloc]initWithCapacity:10];//10只不过是预先分配的10个字数的存储空间
[str setString:@"1234"];
//拼接一个字符串
[str appendString:@"567"];
//
[str appendFormat:@"age is %i and height is %.2f",27,1.55f];
//替换字符串
[str replaceCharactersInRange:[str rangeOfString:@"age"] withString:@"no"];
//插入字符串
[str insertString:@"fuck you" atIndex:2];
//删除字符串
[str deleteCharactersInRange:[str rangeOfString:@"fuck you"]];
NSLog(@"%@",str);
}
void arrayCreate(){
//创建一个空的数组
NSArray *array = [NSArray array];
//创建有一个元素的数组
[NSArray arrayWithObject:@"123"];
}
#pragma mark 字典的初始化
void dictCreate(){
//NSDictionary是不可变的 类似与java 中的final
NSDictionary *dict = [NSDictionary dictionary];
}
int main(int argc, const char * argv[]) {//C语言的main函数,混合编译
@autoreleasepool {//
//
// 35.OC1-OC概述.mp4
//
// 36.OC2-第一个OC程序.mp4
//
// 37.OC3-第一个OC的类.mp4
/*
// insert code here...
//NSLog(@"Hello, World!");
//NSLog(@"Hello, World!");
//创建一个student对象,
//1. 分配内存,调用一个静态方法来分配内存
//暂时把id 当成是任何对象, oc中对象都带一个*,因为它是一门基于消息的动态语言,对象在内存中所以直接返回地址,java中其实也是指针
Students *stu = [Students alloc];
//2. 初始化 调用一个动态方法进行初始化
//内存分配过程
// stu ---> student对象
stu = [stu init];//相当于stu指针给内存中Students对象发送一个init消息
// Student *stu = [[Students alloc] init]
//[stu release];
[stu setAge:10 andNo:7];
int age = [stu age];//get方法直接用属性名的
int no = [stu no];//get方法直接用属性名的
NSLog(@"Hello, World!%i,%i",age,no);
*/
//
// 38.OC4-点语法.mp4
//
/* Person *person = [[ Person alloc]init];
[person setAge:300];
NSLog(@"age is %i",[person age]);
person.age = 500;// person.age 等效与[person setAge:300], oc本身没有点语法,只不过编译器帮我们转换了
NSLog(@"age is %i", person.age);//person.age 等效与[person age],点在等号左边是set方法,右边为get方法,所以以后写成员变量尽量写成_xxx的格式,这样就不会对点语法产生误解
*/
// 39.OC5-构造方法和description方法.mp4
//Students *stu = [[Students alloc]initWithAge:20 andNo:30];//alloc是静态方法,init是动态方法
/* NSLog(@"age is %i and no is %i",stu.age,stu.no);
NSLog(@"%@",stu);///%@代表打印一个对象 默认会调用-(NSString *)description方法
NSString *str = @"yzz";//oc中所有对象都要一个*表示
*/
//
// 40.OC6-self、自动释放、变量作用域.mp4
//
// 41.OC7-OC语法简单复习、new关键字.mp4
//
//Students *stu = [Students new];//分配内存同时调用构造方法,但是只是调用 的默认的构造方法;
// 42.OC8-@property和@synthesize.mp4 只是编译器的特性
/*Property *propert = [[Property alloc] init];
propert.age = 10;
NSLog(@"the age is %i",propert.age);
Teahcer *teacher = [[Teahcer alloc]init];
teacher.age = 10;
NSLog(@"age is %i",teacher.age);*/
//
// 43.OC9-内存管理1-retain和release.mp4
// 任何继承NSobject的对象,对基本数据类型无效
//原理:每个对象内部都保存了一个与之相关联的整数,称为引用计数器
// 当使用alloc、new、或者copy创建一个对象时,对象的引用计数器被置为1;
//给对象发送一个retain消息,可以是引用计数器值+1;
// 当给对象发送一条release消息,可以使引用计数值-1;
//当一个对象的引用计数值为0时,那么它将被销毁,其占用的内存被系统回收,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法。一定不要直接调用dealloc方法,系统会自动调用
注意可以通过对象有没有调用dealloc方法来判断他是否被回收
//可以给对象发送retainCount消息获得当前的引用计数器值
// 在java中new object() 如果没有对象引用他那么他会自动回收,而在oc中[[NSobject alloc]init] 如果没有引用不会被回收 引用计数器一直为1也就是内存溢出
//RetainRelease *retainRelease = [[RetainRelease alloc]init];
//RetainRelease *retainRelease = [[[RetainRelease alloc]init]autorelease];延迟自动释放
//[super release];//引用计数值零, alloc 一次release一次, 如果为零再次调用它会产生野指针错误,也就是访问了不属于你的内存
// 只要调用了一次alloc或者retain都有责任release对象
//
// 44.OC10-内存管理2-set方法的内存管理.mp4 //对象之间的内存管理
MemBetweenObj *mbook = [[MemBetweenObj alloc]init];
//#pragma mark 测试方法 (为某一个方法注释) #pragma mark - 测试方法 对一组方法分组
//
// 45.OC11-@class关键字.mp4
//
// 46.OC12-内存管理3-@property参数详解.mp4
//
// 47.OC13-内存管理4-autorelease.mp4
//
// 48.OC14-Category.mp4 分类语法 java中不存在 团队协作中没人写一个模块儿这样大家都不会冲突
//OC提供了一种与众不同的方式Category,可以动态的为一家存在的类添加新的行为(仅限与方法)
//这样可以保证类的原始设计规模较小,功能增加是在逐步扩展
//使用Category对类进行扩展时,不需要创建子类
//Category使用简单的方式,实现了类的相关方法的模块儿化,把不同的类方法分配到不同的分类文件中
CategoryStudent *category = [[CategoryStudent alloc]init];
category.test2;
//使用场景:1. 在定义类时的某些情况下例如需求变更,你可能想要为其中的某个或几个类添加信的方法
// 2. 给系统自带类进行方法的拓展 比如给NSString 类扩充一个json字符串
// 3.一个类中包含了许多种不同种类的方法需要实现,儿这些方法需要不同的团队成员实现
//
// 49.OC15-Protocol.mp4 对应java里边的接口
//简单来说就是一系列方法的列表,其中声明的方法可以被任何类实现。这种模式一般称为(delegation)模式
//在iOS和OS X开发中,Apple采用了大量的代理模式来实现MVC中View(UI控件)和Controller(控件)的解耦
Button *button = [[Button alloc]init];
ButtonListener *buttonlistener = [[ButtonListener alloc]init];
button.delegate = buttonlistener;
[button click];
//
// 50.OC16-Block.mp4
/*
Block封装了一段代码,可以在任何时候执行
Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是inline(内联函数)的,并且默认情况下它对局部变量是只读的
苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多
block中可以访问外部定义的变量,但是默认情况下不可以修改,但是如果在申明的时候 __block int c = 15;就可以改变外部变量了
*/
test2();
//
// 51.OC17-Protocol、Block、成员变量补充.mp4
//
// 52.Foundation1-常用结构体.mp4
/*
1. NSRange结构体 //通常用来表示事物的一个范围,通常是字符串里的字符范围或者集合里的元素范围
2. NSPoint结构体 //处理UI界面,这个结构体代表的是平面中的一个点,UI界面设计的时候常会用到
3. NSSize 结构体 //这个结构体用来存储高度和宽度
4. NSRect
*/
//
// 53.Foundation2-NSString的创建.mp4
/*
NSString //不可变字符串
*/
//
// 54.Foundation3-指向指针的指针.mp4 //二级指针 **p
char c = 10;
changeC(&c);
NSLog(@"the value of the c is %i",c);
/*
多级指针
void chagenStr(NSString ****str2){ //四级指针
***str2 = @"123"
}
NSString *str = @"456";
changeStr(&&&&str);
*/
//
// 55.Foundation4-NSString的导出.mp4 //写入文件
// stringExport();
//
// 56.Foundation5-NSString的常用方法.mp4 //类似与java 中的不可变string
//
// 57.Foundation6-NSMutableString.mp4 //类似与StringBuffer StringBuilder 等可变的字符串 Mutable可变的
// stringCreate();
//
// 58.Foundation7-NSArray的创建和遍历.mp4 //数组 类似与java中的list 不可变的
/*
*/
//
// 59.Foundation8-NSArray的排序.mp4 //数组排序
//
// 60.Foundation9-NSMutableArray.mp4 //可变数组
//
// 61.Foundation10-NSDictonary.mp4 //字典 //类似java中的 hashmap中的字典
//
// 62.Foundation11-NSMutableDictonary.mp4 // 可变字典
//
// 63.Foundation12-NSNumber.mp4 //整形对象 类似与java 中的Integer 或者String等包装成对象
//NSNumber 可以将基本数据类型包装成对象,这样就可以间接将基本数据类型存进NSArray ,NSDictionary等集合中
//
// 64.Foundation13-NSValue.mp4 //结构体不能直接放到数组中去
//NSNumber是NSValue的子类,但NSNumber只能包装数字类型,NSValue可以包装任意值,也就是可以用NSValue包装结构体后加入NSArray,NSDictionary等集合中
//
// 65.Foundation14-NSNull.mp4
//集合中是不能存放nil值的,因为nil在集合中有特殊含义,但有时确实需要存储一个表示什么都没有的值,那么就可以使用NSNull,他也是NSObject的一个子类
//
// 66.Foundation15-NSDate.mp4 //日期
//返回时间
//
// 67.Foundation16-NSObject和反射.mp4
/*
NSObject 常用方法
-(BOOL)isKindOfClass:(Class)aClass //判断是否为aClass的实例或aClass的子类的实例
-(BOOL)isMemberOfClass:(Class)aClass //判断是否为aClass的实例(不包括aClass的子类)
*/
//
// 68.OC18-copy语法.mp4 //oc设计copy语法的目的是在复制来的对象上修改而不影响原来的对象
/*
一个对象使用copy或mutableCopy方法可以创建对象的副本
copy - 需要实现NSCopping协议,创建的时不可变副本(如NSString、NSArray、NSDictionary)
mutableCopy-需要实现NSMutableCopying协议,创建的时可变的副本(MutableString、MutableArray、MutableDictionary)
深复制:内容copy,
浅复制:指针copy
只有不可变对象创建不可变副本才是前复制,其他都是深复制
*/
//
// 69.iOS基础1-iOS开发概述.mp4
//
// 70.iOS基础2-iOS运行过程详解.mp4
//
// 71.iOS基础3-第一个iOS程序:QQ登录界面.mp4
//4.5.2 通过触摸背景关闭键盘
//1. 创建点击背景时需要调用的方法, -(IBAction)backgroundTap:(id)sender{
//[self.nameField resginFirstResponder];
//[self.numberField resignFirstResponder];
//}
}
return 0;
}