您的位置:首页 > 其它

oc笔记

2015-08-03 07:33 381 查看
//

//  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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: