iOS开发-C 和 OC 知识总结

本文介绍了内存管理的基础概念,包括不同内存区域的作用及特点,并详细解释了MRC和ARC机制。此外,还提供了冒泡排序算法的具体实现,帮助读者理解算法逻辑。最后,文章涵盖了Objective-C中的KVC、类目和延展等高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  
1 . 冒泡排序
void  bullut(intarray[],intcount){

   for(inti =0; i < count - 1; i++) {
       for(intj =0; j < count -1- i; j++) {
           
if (array[j] > array[j +1]) {
               
int temp = array[j];
                array[j] = array[j +
1];
                array[j +
1] = temp;
            }
        }
    }
   
}

  NSMutableArray *bullutArray = [NSMutableArrayarrayWithArray:@[@"3",@"4",@"6",@"1"]];

        NSString *temp;

        for (int i =0; i <bullutArray.count; i++) {

            for (int j =0; j <bullutArray.count -1 - i; j++) {

                if ([[bullutArrayobjectAtIndex:j]integerValue] > [[bullutArrayobjectAtIndex:j + 1]integerValue]) {

                    temp = [bullutArrayobjectAtIndex:j];

                    [bullutArrayreplaceObjectAtIndex:jwithObject:[bullutArrayobjectAtIndex:j +1]];

                    [bullutArrayreplaceObjectAtIndex:j +1withObject:temp];

                    

                }

            }

        

        }


2 . 内存的五大区
   栈区:栈区里面的内存是由系统自动分配和释放,不需要程序员管理
        先进后出,后进先出
        一般局部变量和函数的形参都在栈区,作用域在函数内部
   堆区: 堆区的内存分配和释放是由程序员管理
   常量区: 注意:常量区的内容不允许被修改!!!
      全局静态: 放在全局静态的变量只会初始化一次
            变量的生命周期比较长,在程序退出时才会被销毁
       代码区: 存放二进制文件的区域
          比如:函数    当使用函数时,函数的形参会被临时存到栈区

3  . 属性的属性  
#pragma mark - 3属性的属性
//在使用属性的时候,有三类词语去详细说明属性的细节

//第一类:读写性
@propertyint num;
@property  (readonly)int numA;
// readonly代表只读:只生成get方法
@property  (readwrite)int numB;   //默认
// readwrite代表读写,既有set get方法

//第二类:原子性(非原子性,原子性)
@property(atomic )BOOL resultA;//默认
// atomic原子性,和多线程相关,线程安全性高
@property(nonatomic )BOOL resultB;
// nonatomic非原子性,执行能够效率高,经常用到


//第三类:语义设置(内存)
//三个形容词 assign retain copy
@property (assign)float height;
//基本数据类型assign比如int float CGfloat
@property (retain)NSArray *array;//NSArrayoc中的数组
//oc数据类型用retain
@property (copy)NSString *str;
//当属性需要被拷贝的时候,比如NSString就用copy唯一特别的


4 . ARC(自动管理机制 )    MRC(手动管理机制)
- (void)setName:(NSString *)name{
//    _name = name;
  
//考虑内存优化ARC(自动管理内存机制) ——>MRC手动管理内存机制
   
//从内存角度去考虑实现set方法
   
//这也是使用@synthesize后,系统生成的set方法
   
//第一步判断传入的形参是否和原来的实例变量一样
   
if (_name != name) {
   
//第二步如果不一样,就使用release方法将原来的释放掉
        [
_namerelease];//释放原来的实例变量
   
//第三步再给实例变量赋值
       
_name = [namecopy];//形参调用copy方法,赋给实例变量
       
//copy (NSString)是可变的,retain (oc类型)
       
//当属性用retain修饰时,将下面的这行代码copy变成retain
    }
 
// 基本数据类型不需要考虑内存优化
//   NSInteger  相当于long
}
- (
NSString *)name{
//    return _name;
   
   
return [[_nameretain]autorelease];//retain不变,一直不变
   
//无论属性用retain还是copyget的方法都用retain
   
   
    }


  5 . 内存黄金法则

#pragma mark - 知识点1内存管理(针对对象使用,在堆区使用)

        

//        内存管理机制分为ARCMRC,并且ARC是以MRC为基础的

//        ARC xcode5.0开始的

//        垃圾回收机制适用于Java

//      通过引用计数的概念来管理内存

//       引用计数表示的是对象被引用的次数

        

# pragma mark - 知识点2内存管理黄金法则

        /*

         1 当使用newalloccopy方法,对象的引用计数会0 ->1

         2当使用retain方法时,代表拥有了对象的使用权,此时的对象引用器会在原来基础上加1

         3 当使用release方法时,对象的引用计数-1

         4 当你使用alloc retain copy new方法时,需要对对象进行release或者autorelease操作

         5 alloc,谁负责release

         6当对象的引用计数器的值为0时,对象就会被系统回收

        */

       

6 .  KVC

#pragma mark - 知识点 KVC

        

       //  kvc  (间接访问实例变量的方法),在实例变量没有set get方法的情况下,仍然可以访问

        //  key - value - coding键值编码

        //  其中

        //  setValue forKey     相当于set方法

        //  setValue forKeyPath 相当于set方法

        //  valueForKey         相当于get方法

        //  valueForKeyPath     相当于get方法

7 .  类目 和 延展

类目:是为现有的类增加功能,注意:只能增加方法,不能增加实例变量或属性。
类目里的方法,只能是这个现有的类或者子类使用

延展:未类增加私有属性和方法


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值