月度归档:2016年01月

Objective-c内存管理

前言:在OC语言中,我们大多数时候需要手动去管理内存,来避免内存泄漏,导致系统不可用


内存管理的原理

从Xcode4.2版本开始,xocde引入了ARC(引用计数器)机制,程序在编译时,会自动为代码加入释放代码,因为如果我们手动来管理内存,那么我们必须手动关闭ARC,这样才可以在代码进行 dealloc 处理。

OC中引用计数器机制:OC中每一个对象被创建后都有一个引用计数器的数值(retainCount)同之对应,我们将这个值称之为“引用计数器”,
当一个对象被创建后,retainCount的值变为1
当调用这个对象的 alloc retain new copy方法之后,计数器retainCount会在原来的基础上加1
当调用这个对象的release方法后,计数器retainCount的值会在原来的基础上减1
当retainCount的值为0时,则系统会自动调用当前对象的dealloc方法来销毁这个对象

例test类

//
//  test.h
//  test
//
//  Created by shenye on 16/1/25.
 #import < Foundation / Foundation.h >
 @interface test : NSObject
 #pragma mark --测试属性
 @property(nonatomic,copy)   NSString *info1;
 @property(nonatomic,assign) NSString *info2;
 @end

//  test.m
//  test
//
#import "test.h"
@implementation test

#pragma mark -重写 dealloc

-(void)dealloc{
    NSLog(@"test调用dealloc方法");
    [super dealloc];
}

@end




//
//  main.m
//  test
//
//  Created by shenye on 16/1/25.
//  Copyright © 2016年 com.dchmcl.com. All rights reserved.
//

#import < Foundation / Foundation.h  >

#import "test.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"程序开始执行");
        
        test *t = [[test alloc] init];
        t.info1 =@"测试信息1";
        t.info2 =@"测试信息2";
        
        [t retain];
        NSLog(@"1 retainCount:%lu", (unsigned long)[t retainCount]);
        
        [t retain];
        NSLog(@"2 retainCount:%lu", (unsigned long)[t retainCount]);
        
        
        [t retain];
        NSLog(@"3 retainCount:%lu", (unsigned long)[t retainCount]);
        
        
        [t release];
        NSLog(@"4 retainCount:%lu", (unsigned long)[t retainCount]);

        [t release];
        NSLog(@"5 retainCount:%lu", (unsigned long)[t retainCount]);
        
        
        NSLog(@"类信息:%@ %@", [t info1] ,[t info2]);
        
        
        [t release];
        NSLog(@"6 retainCount:%lu", (unsigned long)[t retainCount]);
        
        
        [t release];
        NSLog(@"7 retainCount:%lu", (unsigned long)[t retainCount]);
        
        
        t.info2 =nil;
        t.info1 =nil;
        t =nil;
        
        
        
    }
    return 0;
}




——–运行结果:

2016-01-25 11:20:01.136 test[5927:416277] 程序开始执行
2016-01-25 11:20:01.137 test[5927:416277] 1 retainCount:2
2016-01-25 11:20:01.137 test[5927:416277] 2 retainCount:3
2016-01-25 11:20:01.138 test[5927:416277] 3 retainCount:4
2016-01-25 11:20:01.138 test[5927:416277] 4 retainCount:3
2016-01-25 11:20:01.138 test[5927:416277] 5 retainCount:2
2016-01-25 11:20:01.138 test[5927:416277] 类信息:测试信息1 测试信息2
2016-01-25 11:20:01.138 test[5927:416277] 6 retainCount:1
2016-01-25 11:20:01.139 test[5927:416277] test调用dealloc方法
2016-01-25 11:20:01.139 test[5927:416277] 7 retainCount:1
Program ended with exit code: 0

以上就是手动释放和保持对象对占用的内存

最经典的OC入门文件

前言:xcode开发工具类似于C#的VS开发工具,平常我们最难深入了解的是OC的语法,
Objectvie-c的语法同我们平时见过的C语言,c# java都有着非常大的不同,下文我们将会对两种语言做一个对比


一、进入IOS概念分析

XCode: 一个IDE开发工具,类似于我们常见的VS ELcispe
Objective-c:一门语言,类似c# java c …语言。
Cocoa:一个框架,里面有很多封装好的函数 方法,方便我们快速开发,类似 .net Framework


二、Objective-c(缩写OC) 语法对比分析

OC是C语言的一种扩展

2.1 OC语法中的加号和减号

在函数前面加上一个+或者-号 ,类似于C#定义一个方法的前缀 private public …
例1 :
(返回数据类型)函数名称(参数1数据类型)参数1值的名称, 参数2的数据名称(参数2的数据类型)参数2值的名称


    -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
         return YES;
    }
    

private bool application(UIApplication *application ,NSDictionary *launchOptions )
{
return true;
}

例2:
c#
private void test(string var)
{
//执行内容
}
OC


    -(void)test:(NSString)var
    {
          //执行内容
    }


在Objective-c中方法类没有私有和公用的概念,全部都为public类型。
————————————————————–
在OC中 -创建的方法,同我们C#中创建普通的public类相同,但是+号创建的方法,我们使用的时候,不用创建类实例


2.2 OC语法中 中括号的概念

中括号的功能主要起调用方法使用
例:
C#中调用上面的方法
this.test(“testInformation”);
OC中调用方法
[self test:@”testInformation”];

2.3大部分类方法都拥有前缀NS***

NS前缀是由于 当初OC语言是由NextStep功能开发的,所以所有的框架和库都采用NS****命名。
如下:
NSString
NSLog
NSURL
NSImage
NS_ENUM_AVAILABLE_IOS(_ios)
….

2.4 引入其它类的方法

#import
#import 同java里面一致类似于c语言里面的#include
为什么系统里面都使用#import

因为import可以自动帮助用户过滤掉多次引用


2.5 定义一个类的方法

C# 中定义一个操作类
using System;
public class testClass{
private string name=”name”;
private int age =25;
privater decimal getQianBao()
{
return 100000.00;
}

public setInfo(string p1,string p2,string p3)
{

}
}

OC定义一个操作类


   testClass.h
   @interface testClass:NSObject{
         NSString *name;
	 NSInteger *age;
	 -(NSDecimalNumber)getQianBao:;
	  -(void)setInfo:(NSString*)P1 P2Name:(NSString*) P2 P3Name:(NSString*) P3;

   }
   @end

   testClass.m
    #import "testClass.h"
    @implementation testClass
    {
         -(void)init{
	   name =@"linux c";
	   age  =100;
	 }

         -(NSDecimalNumber)getQianBao:{
	     return 10000.00;
	 }

	 -(void)setInfo:(NSString*)P1 P2Name:(NSString*) P2 P3Name:(NSString*) P3{
            
          }
    }
    @end


2.6 一个方法中建立多个参数(在第一行里面已经讲过)

接口中申明的方法
-(void)setInfo:(NSString*)P1 P2Name:(NSString*) P2 P3Name:(NSString*) P3;
类中实现方法:
-(void)setInfo:(NSString*)P1 P2Name:(NSString*) P2 P3Name:(NSString*) P3{

}

2.7如何调用一个类

C#调用一个类
testClass t = new testClass();
t.setInfo(“参数1″,”参数2″,”参数3″);

OC调用一个类
采用上述我们生成testClass类
testClass *t = [[testClass alloc] init];//申明一个类
[t setInfo:@”参数1″ P2Name:@”参数2″ P3Name:@”参数3”]

2.8 特殊数据类型

C#中 var 可以定义任意数据类型
OC中 id 可以定义任意数据类型

2.9 OC中可以将不同的数据类型保存到同一个数组中
NSArray *array = @[@”232323tests”,(float)@”100″,[NSNull null],@”992″];
NSArray *arrList = [[NSArray alloc] initWithArray:array];
NSLog(@”a = %@”,arrList);


3.0 布尔类型

c# 中
bool 包括 true false
OC中
BOOL 类型包含 YES NO

3.1 空值

在C#中,我们采用的是null
OC中我们则采用
nil

重新组织和重新生成索引区别

  


索引简介:

索引是数据库引擎中针对表(有时候也针对视图)建立的特别数据结构,
用来帮助快速检索数据。
如果一个表或者视图不建立索引,那么在进行数据检索时,每次都会进行全表扫描。
建立不合使的索引,将会影响数据插入和更新的性能。

进行数据的插入更新删除操作,可能会导致索引碎片的产生,随着索引碎片的不断增加,如果我们不进行索引碎片的清理,那么索引将会失效,变的不可用,影响程序性能。

解决索引碎片的方法:
重新组织索引或者重新生成索引


  重新组织、重新生成

重新组织索引会对最外层数据页里的数据进行重新排序,并压缩索引页。
重新组织的过程中 不会添加任何额外的数据,
所以索引可能还残留着一定程度的碎片。
重新组织索引操作不会占用很多系统资源,在运行过程中外部进程也能够对该索引所在的数据表 进行查询,
所以能够说是联机(online)执行。

  重新生成索引操作:首先删除现用索引,然后重新建立索引,这个过程耗时比较长,但是可以完全清除以前的索引碎片