• IOS的各种控件(转载,防止遗忘)


    UITextView控件的详细讲解

    感觉写的相当不错,而且很全就直接转载了

    1.创建并初始化

    创建UITextView的文件,并在.h文件中写入如下代码:

    #import <UIKit/UIKit.h> 

    @interface TextViewController : UIViewController <UITextViewDelegate> 

                  UITextView *textView; 

    @property (nonatomic, retain) UITextView *textView; 

    @end 

    在.m文件中初始化这个textview,写入代码如下:

    self.textView = [[[UITextView alloc] initWithFrame:self.view.frame]autorelease]; //初始化大小并自动释放 

    self.textView.textColor = [UIColor blackColor];//设置textview里面的字体颜色 

    self.textView.font = [UIFont fontWithName:@"Arial" size:18.0];//设置字体名字和字体大小 

    self.textView.delegate = self;//设置它的委托方法 

    self.textView.backgroundColor = [UIColor whiteColor];//设置它的背景颜色 

                  

    self.textView.text = @"Now is the time for all good developers tocome to serve their country. Now is the time for all good developers to cometo serve their country.";//设置它显示的内容 

    self.textView.returnKeyType = UIReturnKeyDefault;//返回键的类型 

    self.textView.keyboardType = UIKeyboardTypeDefault;//键盘类型 

    self.textView.scrollEnabled = YES;//是否可以拖动 

                  

    self.textView.autoresizingMask = UIViewAutoresizingFlexibleHeight;//自适应高度 

                  

    [self.view addSubview: self.textView];//加入到整个页面中 

    2. UITextView退出键盘的几种方式

    因为你点击UITextView会出现键盘,如果你退出键盘,有如下几种方式:

    (1)如果你程序是有导航条的,可以在导航条上面加多一个Done的按钮,用来退出键盘,当然要先实UITextViewDelegate。

    代码如下:

    - (void)textViewDidBeginEditing:(UITextView *)textView {   

       UIBarButtonItem *done =    [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(leaveEditMode)] autorelease];   

       self.navigationItem.rightBarButtonItem = done;       

    }   

    - (void)textViewDidEndEditing:(UITextView *)textView {   

        self.navigationItem.rightBarButtonItem = nil;   

    }   

    - (void)leaveEditMode {   

        [self.textView resignFirstResponder];   

    }   

    (2)如果你的textview里不用回车键,可以把回车键当做退出键盘的响应键。

    代码如下:

    #pragma mark - UITextView Delegate Methods   

    -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text   

    {   

        if ([text isEqualToString:@" "]) {   

            [textView resignFirstResponder];   

            return NO;   

        }   

        return YES;   

    }   

    这样无论你是使用电脑键盘上的回车键还是使用弹出键盘里的return键都可以达到退出键盘的效果。

    (3)还有你也可以自定义其他加载键盘上面用来退出,比如在弹出的键盘上面加一个view来放置退出键盘的Done按钮。

    代码如下:

    UIToolbar * topView = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 30)];   

        [topView setBarStyle:UIBarStyleBlack];   

        UIBarButtonItem * helloButton = [[UIBarButtonItem alloc]initWithTitle:@"Hello" style:UIBarButtonItemStyleBordered target:self action:nil];         

        UIBarButtonItem * btnSpace = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];   

           

        UIBarButtonItem * doneButton = [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(dismissKeyBoard)];   

        NSArray * buttonsArray = [NSArray arrayWithObjects:helloButton,btnSpace,doneButton,nil];   

        [doneButton release];   

        [btnSpace release];   

        [helloButton release];   

        [topView setItems:buttonsArray];   

        [tvTextView setInputAccessoryView:topView];   

    -(IBAction)dismissKeyBoard   

    {   

        [tvTextView resignFirstResponder];   

    }   

    (4)设置UITextView圆角问题

    做法是在#import QuartzCore/QuartzCore.h 后,便能調用[textView.layer setCornerRadius:10]; 來把UITextView 设定圓角

    (5)UITextView根据文本大小自适应高度

    通过实现文本字数来确定高度,如下:

    NSString * desc = @"Description it is  a test font, and don't become angry for which i use to do here.Now here is a very nice party from american or not!";   

    CGSize  size = [desc sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(240, 2000) lineBreakMode:UILineBreakModeWordWrap];  

    只有UILabel需要定义的numberoflines为0,即不做行数的限制。如下:

    [label  setNumberOfLines:0];   

    [label  setFrame:CGRectMake(40, 135, 240, size.height+10)];   

    [label setText:desc];  

    (6)UITextView自定选择文字后的菜单

    在ViewDidLoad中加入:

    UIMenuItem *menuItem = [[UIMenuItem alloc]initWithTitle:@"分享到新浪微博" action:@selector(changeColor:)]; 

    UIMenuController *menu = [UIMenuController sharedMenuController]; 

    [menu setMenuItems:[NSArray arrayWithObject:menuItem]]; 

    [menuItem release]; 

    当然上面那个@selector里面的changeColor方法还是自己写吧,也就是说点击了我们自定义的菜单项后会触发的方法。

    然后还得在代码里加上一个方法:

    -(BOOL)canPerformAction:(SEL)action withSender:(id)sender 

    if(action ==@selector(changeColor:)) 

    if(textView.selectedRange.length>0) 

    return YES; 

    return NO; 

    今天的UITextView就讲到这里,主要讲了UITextView的初始化和开发中会遇到的一些问题和自定义等问题。谢谢大家支持哈。

    posted @ 2012-01-31 19:09 SuperHappy 阅读(66) 评论(0) 编辑
     
    - (void)loadView
    {
        [super loadView];
        //1.UILable的大小自适应实例:
        UILabel *myLabel=[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 2, 2)];//设定位置与大小
        [myLabel setFont:[UIFont fontWithName:@"Helvetica" size:20.0]];//格式
        [myLabel setNumberOfLines:0];//行数,只有设为0才可以自适应
        [myLabel setBackgroundColor:[UIColor clearColor]];//背景色
        myLabel.shadowColor = [UIColor darkGrayColor];//阴影颜色
        myLabel.shadowOffset = CGSizeMake(1.0,1.0);//阴影大小
        
        NSString *text = @"abcdefghigklmnopqrstuvwxyz";
        UIFont *font = [UIFont fontWithName:@"Helvetica" size:20.0];
        CGSize size = [text sizeWithFont:font constrainedToSize:CGSizeMake(175.0f, 2000.0f) lineBreakMode:UILineBreakModeWordWrap];
        CGRect rect=myLabel.frame;
        rect.size=size;
        [myLabel setFrame:rect];
        [myLabel setText:text];
         myLabel.shadowColor = [UIColor darkGrayColor];//阴影颜色
         myLabel.shadowOffset = CGSizeMake(2.0,2.0);//阴影大小
        [self.view addSubview:myLabel];
        [myLabel release];
        //2.UILable的基本用法获取自馒头MAN百度空间,感谢馒头MAN
                //空间地址:http://hi.baidu.com/bunsman/blog/item/95777b0ebacf05fe36d122e2.html
        UILabel *label1 = [[UILabel alloc]initWithFrame:CGRectMake(50.0, 40.0, 200.0, 30.0)];     
        UILabel *label2 = [[UILabel alloc]initWithFrame:CGRectMake(50.0, 80.0, 200.0, 50.0)];     
        UILabel *label3 = [[UILabel alloc]initWithFrame:CGRectMake(50.0, 140.0, 200.0, 50.0)];     
        UILabel *label4 = [[UILabel alloc]initWithFrame:CGRectMake(50.0, 200.0, 200.0, 50.0)];     
        UILabel *label5 = [[UILabel alloc]initWithFrame:CGRectMake(50.0, 260.0, 200.0, 50.0)];     
        UILabel *label6 = [[UILabel alloc]initWithFrame:CGRectMake(50.0, 320.0, 200.0, 50.0)];     
        UILabel *label7 = [[UILabel alloc]initWithFrame:CGRectMake(50.0, 380.0, 200.0, 50.0)];     
        
        //设置显示文字     
        label1.text = @"label1";     
        label2.text = @"label2";     
        label3.text = @"label3--label3--label3--label3--label3--label3--label3--label3--label3--label3--label3--11个";     
        label4.text = @"label4--label4--label4--label4--4个";     
        label5.text = @"label5--label5--label5--label5--label5--label5--6个";     
        label6.text = @"label6";     
        label7.text = @"label7";     
        
        //设置字体:粗体,正常的是 SystemFontOfSize     
        label1.font = [UIFont boldSystemFontOfSize:20];     
        
        //设置文字颜色  
        label1.textColor = [UIColor orangeColor];     
        label2.textColor = [UIColor purpleColor];     
        //设置背景颜色 
        label1.backgroundColor = [UIColor clearColor];
        label2.backgroundColor = [UIColor  colorWithRed:0.5f green:30/255.0f blue:0.3f alpha:0.5f];
        //设置文字位置     
        label1.textAlignment = UITextAlignmentRight;     
        label2.textAlignment = UITextAlignmentCenter;     
        //设置字体大小适应label宽度     
        label4.adjustsFontSizeToFitWidth = YES;
        //设置label的行数     
        label5.numberOfLines = 2;     
        
        //设置高亮     
        label6.highlighted = YES;     
        label6.highlightedTextColor = [UIColor orangeColor];     
        
        //设置阴影     
        label7.shadowColor = [UIColor redColor];     
        label7.shadowOffset = CGSizeMake(1.0,1.0);     
        
        //设置是否能与用户进行交互     
        
        label7.userInteractionEnabled = YES;     
        
        //设置label中的文字是否可变,默认值是YES     
        label3.enabled = NO;     
        
        //设置文字过长时的显示格式     
        
        label3.lineBreakMode = UILineBreakModeMiddleTruncation;//截去中间     
        //  typedef enum {     
        //      UILineBreakModeWordWrap = 0,     
        //      UILineBreakModeCharacterWrap,     
        //      UILineBreakModeClip,//截去多余部分     
        //      UILineBreakModeHeadTruncation,//截去头部     
        //      UILineBreakModeTailTruncation,//截去尾部     
        //      UILineBreakModeMiddleTruncation,//截去中间     
        //  } UILineBreakMode;     
        
        //如果adjustsFontSizeToFitWidth属性设置为YES,这个属性就来控制文本基线的行为     
        label4.baselineAdjustment = UIBaselineAdjustmentNone;     
        //  typedef enum {     
        //      UIBaselineAdjustmentAlignBaselines,     
        //      UIBaselineAdjustmentAlignCenters,     
        //      UIBaselineAdjustmentNone,     
        //  } UIBaselineAdjustment;     
        
        
        [self.view addSubview:label1];     
        [self.view addSubview:label2];     
        [self.view addSubview:label3];     
        [self.view addSubview:label4];     
        [self.view addSubview:label5];     
        [self.view addSubview:label6];     
        [self.view addSubview:label7];     
        
        [label1 release];     
        [label2 release];     
        [label3 release];     
        [label4 release];     
        [label5 release];     
        [label6 release];     
        [label7 release];         
        
    }
    posted @ 2012-01-31 18:50 SuperHappy 阅读(212) 评论(0) 编辑
     

    1、窗口:UIWindow

    iPhone的规则是一个窗口,多个视图,窗口是你在app显示出来你看到的最底层,他是固定不变的,基本上可以不怎么理会,但要知道每层是怎样的架构。

    2、视图:UIView

    UIView是用户构建界面的基础,所有的控件都是在这个页面上画出来的,你可以把它当成是一个画布,你可以通过UIView增加控件,并利用控件和用户进行交互和传递数据。

    窗口和视图是最基本的类,创建任何类型的用户界面都要用到。窗口表示屏幕上的一个几何区域,而视图类则用其自身的功能画出不同的控件,如导航栏,按钮都是附着视图类之上的,而一个视图则链接到一个窗口。

    3、视图控制器:UIViewController

    视图控制器UIViewController,你可以把他当成是对你要用到视图UIView进行管理和控制,你可以在这个UIViewController控制你要显示的是哪个具体的UIView。另外,视图控制器还增添了额外的功能,比如内建的旋转屏幕,转场动画以及对触摸等事件的支持。

    4、  UIKit简介

    (1)显示数据的视图

    UITextView:将文本段落呈现给用户,并允许用户使用键盘输入自己的文本。

    UILabel:实现短的只读文本,可以通过设置视图属性为标签选择颜色,字体和字号等。

    UIImageView:可以通过UIImage加载图片赋给UIImageView,加载后你可以指定显示的位置和大小。

    UIWebView:可以提供显示HTML.PDF等其他高级的Web内容。包括xls,word等文档等。

    MKMapView:可以通过MKMapView向应用嵌入地图。很热门的LBS应用就是基于这个来做的。还可以结合MKAnnotationView和MKPinAnnotationView类自定义注释信息注释地图。

     

    UIScrollView:一般用来呈现比正常的程序窗口大的一些内容。可以通过水平和竖直滚动来查看全部的内容,并且支持缩放功能。

    (2) 做出选择的视图

    UIAlertView:通过警告视图让用户选择或者向用户显示文本。

    UIActionSheet:类似UIAlertView,但当选项比较多的时候可以操作表单,它提供从屏幕底部向上滚动的菜单。

    (3)其他

    UIBuuton:主要是我们平常触摸的按钮,触发时可以调用我们想要执行的方法。

    UISegmentControl:选择按钮,可以设置多个选择项,触发相应的项调用不同的方法。

    UISwitch:开关按钮,可以选择开或者关。

    UISlideer:滑动按钮,常用在控制音量等。

    UITextField:显示文本段,显示所给的文本。

    UITableView:表格视图,可以定义你要的表格视图,表格头和表格行都可以自定义,自定义的一个表格如下图:

    UIPickerView:选择条,一般用于日期的选择。

    UISearchBar:搜索条,一般用于查找的功能。

    UIToolBar:工具栏:一般用于主页面的框架。

    UIActivityIndicatorView:进度条,一般用于显示下载进度。

    UIProgressView:进度条,一般用于显示下载的进度条。

    今天就简单的介绍了一下IOS应用开发常用的一些控件,还有基础的UIView,UIWindow和UIViewControl之间的关系,这些是基础,直接影响到以后开发的能力,接下来我将分开讲这些控件。

    对于Button的圆角显示,利用layer实现

    示例:

    对button1的边框进行设置

    #import <QuartzCore/QuartzCore.h>//不要忘记添加库文件

    CALayer *layer1=[button1 layer];

        //是否设置边框以及是否可见

        [layer1 setMasksToBounds:YES];

        //设置边框圆角的弧度

        [layer1 setCornerRadius:15.0];

        //设置边框线的宽

        [layer1 setBorderWidth:2.0];

        //设置边框线的颜色

        [layer1 setBorderColor:[[UIColorgrayColor] CGColor]];

    posted @ 2012-01-31 15:52 SuperHappy 阅读(48) 评论(0) 编辑
     

    新建一个继承于UIViewControll的类,并在.m中添加如下代码

    -(void)doSomeThing:(NSNotification *)aNote
    {
        NSDictionary *dict = [aNote object];
        NSLog(@"%@",dict);
    }
    - (void)loadView
    {
        [super loadView];
        NSString *myString = @"some Value";
        NSDictionary *myDict = [[NSDictionary alloc]initWithObjectsAndKeys:myString,@"first", nil];
        [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(doSomeThing:) name:@"notification" object:nil];
        
        [[NSNotificationCenter defaultCenter]postNotificationName:@"notification" object:myDict];
        
    }

    设置通知:

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(doSomeThing:) name:@"notification" object:nil];

    addObserver 这个是观察者,就是说 在什么地方接收通知;

     selector 这个是收到通知后,调用何种方法;

     name: 这个是通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。

       object:  对象,当设定为nil时,默认为所有名称为以上消息名称的(notification)都接收不管发送者是谁。

    发送通知:

    [[NSNotificationCenter defaultCenter]postNotificationName:@"notification" object:myDict];

    postNotificationName:通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。

    object:对象,当设定为nil时,默认为所有名称为以上消息名称的(notification)都发送。

    小例子仅仅是在一个类下的通知,实际来说通知更多的应用于不同的类之间传递信息。

    posted @ 2012-01-31 15:38 SuperHappy 阅读(57) 评论(0) 编辑
     

    用4.2创建的空模班,添加的UIViewController类,取名为mapView.(按正规命名方式应该为MapView,大家见谅)。

    以下为添加的代码

    mapView.h

    1. #import <UIKit/UIKit.h>  
    2. #import <MapKit/MapKit.h>  
    3. #import <CoreLocation/CoreLocation.h>  
    4. #import <QuartzCore/QuartzCore.h>  
    5.   
    6. @interface mapView : UIViewController <CLLocationManagerDelegate>  
    7. {  
    8.     CLLocationManager *locManager;  
    9.     MKMapView *map;  
    10.     CLLocation *bestLocation;  
    11. }  
    12. @property (retain) CLLocationManager *locManager;  
    13. @property (retain) CLLocation *bestLocation;  
    14. @end  

     mapView.m

    //
    //  mapView.m
    //  Map
    //
    //  Created by SuperHappy on 12-1-31.
    //  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
    //
    
    #import "mapView.h"
    #define BARBUTTON(TITLE, SELECTOR)     [[[UIBarButtonItem alloc] initWithTitle:TITLE style:UIBarButtonItemStylePlain target:self action:SELECTOR] autorelease]
    @implementation mapView
    @synthesize locManager;
    @synthesize bestLocation;
    
    - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
    {
        NSLog(@"Location manager error :%@",[error description]);
    }
    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
    {
        if (!self.bestLocation) {
            self.bestLocation = newLocation;
        }
        else if(newLocation.horizontalAccuracy < bestLocation.horizontalAccuracy)
            self.bestLocation = newLocation;
        map.region = MKCoordinateRegionMake(self.bestLocation.coordinate, MKCoordinateSpanMake(0.1f, 0.1f));
        map.showsUserLocation = YES;
        map.zoomEnabled = NO;
    
    }
    - (void)findme
    {
        // disable right button
        self.navigationItem.rightBarButtonItem = nil;
        
        // Search for the best location
        self.bestLocation = nil;
        self.locManager.delegate = self;
        [self.locManager startUpdatingLocation];
    }
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
        }
        return self;
    }
    
    - (void)didReceiveMemoryWarning
    {
        // Releases the view if it doesn't have a superview.
        [super didReceiveMemoryWarning];
        
        // Release any cached data, images, etc that aren't in use.
    }
    
    #pragma mark - View lifecycle
    
    
    // Implement loadView to create a view hierarchy programmatically, without using a nib.
    - (void)loadView
    {
        [super loadView];
        map = [[MKMapView alloc]initWithFrame:CGRectMake(10, 10, 300, 300)];
        [self.view addSubview:map];
        [map release];
        
        self.navigationController.navigationBar.tintColor = [UIColor redColor];
        
        self.locManager = [[[CLLocationManager alloc] init] autorelease];
        if (!self.locManager.locationServicesEnabled)
        {
            NSLog(@"User has opted out of location services");
            return;
        }
        else 
        {
            // User generally allows location calls
            self.locManager.desiredAccuracy = kCLLocationAccuracyBest;
            self.navigationItem.rightBarButtonItem = BARBUTTON(@"Find Me", @selector(findme));
        }
    
    }
    
    
    /*
    // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    }
    */
    
    - (void)viewDidUnload
    {
        [super viewDidUnload];
        // Release any retained subviews of the main view.
        // e.g. self.myOutlet = nil;
    }
    
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        // Return YES for supported orientations
        return (interfaceOrientation == UIInterfaceOrientationPortrait);
    }
    
    @end



    posted @ 2012-01-31 14:13 SuperHappy 阅读(26) 评论(0) 编辑
     

    NSDate的常见用法总结

            // 当前时间创建NSDate

            NSDate *myDate = [NSDate date];

            NSLog(@"myDate = %@",myDate);

            //从现在开始的24小时

            NSTimeInterval secondsPerDay = 24*60*60;

            NSDate *tomorrow = [NSDate dateWithTimeIntervalSinceNow:secondsPerDay];

            NSLog(@"myDate = %@",tomorrow);

            //根据已有日期创建日期

             NSTimeInterval secondsPerDay1 = 24*60*60;

            NSDate *now = [NSDate date];

            NSDate *yesterDay = [now addTimeInterval:-secondsPerDay1];

            NSLog(@"yesterDay = %@",yesterDay);

            

            //比较日期

            BOOL sameDate = [now isEqualToDate:yesterDay];

            NSLog(@"sameDate = %lu",sameDate);

            //获取较早的日期

            NSDate *earlierDate = [yesterDay earlierDate:now];

            NSLog(@"earlierDate  = %@",earlierDate);

            //较晚的日期

            NSDate *laterDate = [yesterDay laterDate:now];

            NSLog(@"laterDate  = %@",laterDate);

            //两个日期之间相隔多少秒

            NSTimeInterval secondsBetweenDates= [yesterDay timeIntervalSinceDate:now];

            NSLog(@"secondsBetweenDates=  %lf",secondsBetweenDates);

            //通过NSCALENDAR类来创建日期

            NSDateComponents *comp = [[NSDateComponentsalloc]init];

            [comp setMonth:06];

            [comp setDay:01];

            [comp setYear:2001];

            NSCalendar *myCal = [[NSCalendaralloc]initWithCalendarIdentifier:NSGregorianCalendar];

            NSDate *myDate1 = [myCal dateFromComponents:comp];

            NSLog(@"myDate1 = %@",myDate1);

            

            //从已有日期获取日期

            unsigned units  = NSMonthCalendarUnit|NSDayCalendarUnit|NSYearCalendarUnit;

            NSDateComponents *comp1 = [myCal components:units fromDate:now];

            NSInteger month = [comp1 month];

            NSInteger year = [comp1 year];

            NSInteger day = [comp1 day];

            //NSDateFormatter实现日期的输出

            NSDateFormatter *formatter = [[NSDateFormatteralloc]init];

            [formatter setDateStyle:NSDateFormatterFullStyle];//直接输出的话是机器码

            //或者是手动设置样式[formatter setDateFormat:@"yyyy-mm-dd"];

            NSString *string = [formatter stringFromDate:now];

            NSLog(@"string = %@",string);

            NSLog(@"formater = %@",formatter);

            

    posted @ 2012-01-31 13:57 SuperHappy 阅读(117) 评论(0) 编辑
     

    NSDictionary的常见用法总结

            NSArray *array1 = [NSArray arrayWithObjects:@"iphone",@"ipod",nil];

            NSArray *array2 = [NSArray arrayWithObjects:@"mac",@"imac",@"mac pro",nil];

            //类方法初始化自动释放

            NSDictionary *myDictionary = [NSDictionary dictionaryWithObjectsAndKeys:array1,@"mobile",array2,@"computers",nil];//注意用nil结束

            NSLog(@"myDictionary = %@",myDictionary);

            

            int dictSize = [myDictionary count];

            //访问字典中的值

            NSArray *mobile = [myDictionary objectForKey:@"mobile"];

            //从一个对象获取键

            NSArray *keys = [myDictionary allKeysForObject:array1];

            //获取字典中所有值得一个数组

            NSArray *values = [myDictionary allValues];

            //快速枚举

            for(id key in myDictionary)

            {

                NSLog(@"key: %@,value: %@",key,[myDictionary objectForKey:key]);

            }

            //如果字典只包含属性列表对象(NSData,NSDate,NSNumber,NSString,NSArray或NSDictionary)可以保存到文件中

            NSString *filePath = [[[NSBundlemainBundle]resourcePath]stringByAppendingPathComponent:@"dict.txt"];

            BOOL success = [myDictionary writeToFile:filePath atomically:YES];

            //用文件填充

            NSDictionary *myDict2 =[NSDictionary dictionaryWithContentsOfFile:filePath];

            

            //可变字典

            NSMutableDictionary *dictMutable = [[NSMutableDictionary alloc]initWithObjectsAndKeys:array1,@"mobile",array2,@"computer", nil];

            NSString *string4 = @"stringTV";

            //修改对象

            [dictMutable setObject:string4 forKey:@"media"];

            //删除对象

            [dictMutable removeObjectForKey:@"mobile"];

            //删除多个对象

            NSArray *keyArray =[NSArray arrayWithObjects:@"mobile",@"computer", nil];

            [dictMutable removeObjectForKey:keyArray];

            //删除所有对象

            [dictMutable removeAllObjects];

            

    posted @ 2012-01-31 13:54 SuperHappy 阅读(217) 评论(0) 编辑
     

    NSArray的基本应用总结

        NSString *string1 = @"two";

            NSString *string2 = @"one";

            //创建数组

            NSArray *array1 = [NSArray arrayWithObjects:string1,string2, nil];

            NSArray *array2 = [NSArray arrayWithArray:array1];

            //创建数组只包含已有数组的一部分

            NSRange range = NSMakeRange(0, 2);

            NSArray *subArray = [array1 subarrayWithRange:range];

            //array的长度

            int arrayLength = [array1 count];

            //访问数组中特定位置的一个对象

            NSString *string = [array1 objectAtIndex:0];

            //是否包含指定对象

            BOOL isInArray = [array1 containsObject:string1];

            //对象在数组中的位置

            int index = [array1 indexOfObject:string1];

            

            //遍历一个数组中的值

            for(NSString *obj in array1)

            {

                NSLog(@"%@",obj);

            }

            //反向遍历一个数组的值

            for(NSString *objfan in [array1 reverseObjectEnumerator])

            {

                NSLog(@"%@",objfan);

            }

            //对字符串的重新排序(有点问题)

            //[array1 sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

            //NSLog(@"array1 = %@",array1);

            //创建动态数组

            NSMutableArray *myarray = [[NSMutableArray alloc]initWithObjects:string1,string2, nil];

            NSString *string3 = @"Three";

            //向动态数组中添加

            [myarray addObject:string3];

            [myarray addObject:string2];

            [myarray insertObject:string3 atIndex:0];

            [myarray insertObject:string2 atIndex:1];

            //替换

            [myarray replaceObjectAtIndex:1withObject:string3];

            //删除

            [myarray removeObject:string3];

            //删除特定位置对象

            [myarray removeObjectAtIndex:0];

            //删除几个对象

            [myarray removeObjectsInRange:range];

            //删除所有对象

            [myarray removeAllObjects];

            

    posted @ 2012-01-31 13:52 SuperHappy 阅读(206) 评论(0) 编辑
     

    参照《iphone SDK 3开发快速上手》编写,特此声明        

           //创建一个NSString

            NSString *myString1 = @"some string";

            NSLog(@"%@",myString1);

           

            //格式化创建

            NSString *myString2 = [NSString stringWithFormat:@"%@",myString1];

              NSLog(@"%@",myString2);

            //返回数字的值

            NSString *myString3 = @"1234abc";

            double doubleString = [myString3 floatValue];//获得123

              NSLog(@"%f",doubleString);

            int intString = [myString3 intValue];//获得123

            NSLog(@"%d",intString);

            NSUInteger stringLenth = [myString3 length];

            /*NSUinteger 的输出方式为%lu*/

            NSLog(@"%lu",stringLenth);

            //比较两个字符串,若相同返回TURE

            BOOL areEqual = 

            [myString1 isEqualToString:myString2];

            NSLog(@"areEqual = %d",areEqual);

            //区分大小写的比较

            BOOL areEqual1 = ([myString1 caseInsensitiveCompare:myString2] == NSOrderedSame);

            NSLog(@"areEqual1 = %d",areEqual1);

            //转换大小写

            NSString *myString4 = @"asdfg";

            NSString *upper = [myString4 uppercaseString];

            NSString *lower = [upper lowercaseString];

            NSLog(@"upper = %@",upper);

            NSLog(@"lower = %@",lower);

            

            //截去字符串(以空格为例)

            NSString *myString5 = @"   one     two three  ";

            NSString *trimmed1 = [myString5 stringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]];

            //whitespaceAndNewlineCharacterSet去除前后的空格和换行符

            NSString *trimmed2 = [myString5 stringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceCharacterSet]];

            //whitespaceCharacterSet 去除前后的空格,实际效果来看只实现了去除首字母前面的空格

             NSLog(@"myString5 = %@",myString5);

             NSLog(@"trimmed1 = %@",trimmed1);

             NSLog(@"trimmed2 = %@",trimmed2);

        //predicate 断言断定,使基于,下面的方法实现删除空格

            NSPredicate *noE = [NSPredicatepredicateWithFormat:@"SELF!=''"];

            NSArray *part = [myString5 componentsSeparatedByCharactersInSet:[NSCharacterSetwhitespaceCharacterSet]];

            NSArray *file = [part filteredArrayUsingPredicate:noE];

            NSString *trimmed3 = [file componentsJoinedByString:@""];

             NSLog(@"trimmed3 = %@",trimmed3);

            

            //有已知字符串创建子字符串

            NSString * number = @"abx cdefghi gklmn";

            //substringToIndex获取字符串的前三个

            //substringFromIndex从第三个开始截取到最后

            NSString *myString6 = [number substringToIndex:3];

            NSLog(@"myString6 = %@",myString6);

            

            NSRange range = NSMakeRange(4, 5);

            //用边界截取起始位置为第四个,长度为5个长度

            NSString *aString = [number substringWithRange:range];

            NSLog(@"aString = %@",aString);

            //创建成数组

            NSArray *arr = [number componentsSeparatedByString:@" "];

            NSLog(@"arr = %@",arr);

            //替换子字符串

            NSString *myString7 = [number stringByReplacingOccurrencesOfString:@"efg"withString:@"aaa"];

            NSLog(@"myString7 = %@",myString7);

            //查找子字符串,这段代码返回(4,3);

            NSRange found = [number rangeOfString:@"cde"];

            NSLog(@"found.location = %lu",found.location);

            NSLog(@"%lu",found.length);

            //判读那是否包含

            BOOL found1 = ([number rangeOfString:@"cde"].location !=NSNotFound);

            NSLog(@"found1 = %lu",found1);

            //组合字符串

            NSString *myString9 = [myString1 stringByAppendingString:myString7];

            NSLog(@"myString9 = %@,myString1 = %@,myString7 = %@",myString9,myString1,myString7);

            

            NSString *myString10 = [myString1 stringByAppendingFormat:myString7];

             NSLog(@"myString10 = %@,myString1 = %@,myString7 = %@",myString10,myString1,myString7);

            

            //将文件内容写入到字符串中

            NSString *fileContents = [NSString stringWithContentsOfFile:@"123.text"];

            //获取文件扩展名

            NSString *filename = @"11111.txt";

            NSString *fileExtension = [filename pathExtension];

            NSLog(@"fileExtension = %@",fileExtension);

            

            //将URL内容写入字符串,有点问题

            NSURL *url = [NSURLURLWithString:@"http://www.baidu.com"];

              NSLog(@"url = %@",url);

            NSString *pageContents  = [NSString stringWithContentsOfURL:url];

            //NSLog(@"pageContents = %@",pageContents);

            

    posted @ 2012-01-31 13:50 SuperHappy 阅读(223) 评论(0) 编辑
     

    内存管理个人总结

    无论编写任何程序,都需要确保能够有效和高效地管理资源。程序内存就是这些资源中的一种。在Objective-C程序中,必须确保所创建的对象,在不再需要它们的时候被销毁。

    注意:iOS不提供垃圾回收机制。

    一般规则:

    只能释放或自动释放自己所拥有的对象

    一般以alloc ,new, copy创建的对象都具有所有权,或者如果向一个对象发送了一条retain消息,也会获得该对象的所有权。

    此时需要用release进行释放或者调用自动释放池autorelease;自动释放池的调用是系统来完成的。

    需要将接收到的对象存储为某个实例变量的属性,您必须保留或复制该对象。

    释放实例:

    UIView *view 1= [[UIView alloc]init];

    Self.view = view1;

    [view1 release];

    不需要释放的例子:

    UIButton*button=[UIButton buttonWithType:UIButtonTypeRoundedRect];

    由于调用的类方法没有使用alloc,new,copy等所以它自动释放,不需要手动释放。

    调用自动释放池的例子:

    -(NSArray *)rearray

    {

    NSArray *array = [[NSArray alloc]initWithObjects:@”1”,@”2”,nil];

    return [array autorelease];

    }

    这个方法既没有破坏内存规则,又避免了接收值的使用者不知道何时销毁对象的现象。如果直接return array会造成内存泄露,如果先释放在返回的话会返回无效对象([array release];return array;)这也是错误的。当然如果直接调用类方法就可以这样做:

    -(NSArray *)rearray

    {

    NSArray *array = [NSArray arrayWithObjects:@”1”,@”2”,nil];

    return array;

    }

    在 Objective-C 程序中,对象会被创建和销毁。为了确保应用程序不会使用不必要的内存,对象应该在不需要它们的时候被销毁。当然,在需要对象时保证它们不被销毁也很重要。

    任何对象都可能拥有一个或多个所有者。只要一个对象至少还拥有一个所有者,它就会继续存在。如果一个对象没有所有者,则运行时系统会自动销毁它。

    可以使用retain来获得一个对象的所有权。

    保留计数(retainCount)

    在调用retain方法后通过引用计数—通常被称为“保留计数”—实现的。每个对象都有一个保留计数。

    创建一个对象时,该对象的保留计数为1。

    向一个对象发送retain消息时,该对象的保留计数加1。

    向一个对象发送release消息时,该对象的保留计数减1。

    向一个对象发送autorelease消息时,该对象的保留计数会在将来的某个阶段减1。

    如果一个对象的保留计数被减为0,该对象就会被回收.(直接调用dealloc进行释放)。

    当显式地查询对象的保留计数是多少。由于添加了保护机制,当保留计数被减为0时,控制台输出仍然为1因此会造成误导。

    共享对象的有效性

    Cocoa的所有权策略规定,被接收的对象通常应该在整个调用方法的作用域内保持有效。此外,还可以返回从当前作用域接收到的对象,而不必担心它被释放。对象的getter方法返回一个缓存的实例变量或者一个计算值,这对您的应用程序来说无关紧要。重要的是,对象会在您需要它的这段期间保持有效。

    这一规则偶尔也有一些例外情况,主要可以总结为以下两类。

    当对象从一个基本的集合类中被删除的时候。

    heisenObject = [array objectAtIndex:n];

    [array removeObjectAtIndex:n];

    // heisenObject could now be invalid.

    当对象从一个基本的集合类中被删除时,它会收到一条release(不是autorelease)消息。如果该集合是这个被删除对象的唯一所有者,则被删除的对象(例子中的heisenObject)将被立即回收。

    当一个“父对象”被回收的时候。

    id parent = <#create a parent object#>;

    // ...

    heisenObject = [parent child] ;

    [parent release]; // Or, for example: self.parent = nil;

    // heisenObject could now be invalid.

    在某些情况下,您通过另外一个对象得到某个对象,然后直接或间接地释放父对象。如果释放父对象会使其被回收,而且父对象是子对象的唯一所有者,那么子对象(例子中的heisenObject)将同时被回收(假设它在父对象的dealloc方法中收到一条release而非autorelease消息)。

    为了防止这些情况发生,您要在接收heisenObject后保留该对象,并

    在使用完该对象后对其进行释放,例如:

    heisenObject = [[array objectAtIndex:n] retain];

    [array removeObjectAtIndex:n];

    // use heisenObject.

    [heisenObject release];

    如果在您的类中有实例变量对象,您必须实现一个dealloc方法来释放它们,然后调用超类的dealloc实现。

    重要:决不要直接调用另一个对象的dealloc方法。

    保留循环

    在某些情况下,两个对象之间可能会出现循环引用的情况,也就是说,每一个对象都包含一个实例变量引用对方对象。例如,考虑一个文本程序,程序中对象间的关系如图1所示。“文档(Document)”对象为文档中的每个页面创建一个“页(Page)”对象。每个Page对象具有一个实例变量,用来跟踪该页所在的文档。如果Document对象保留了Page对象, 同时Page对象也保留Document对象,则这两个对象都永远不会被释放。只有Page对象被释放,Document的引用计数才能变为0,而只有Document对象被回收,Page对象才能被释放。

    针对保留循环问题的解决方案是“父”对象应保留其“子”对象,但子对象不应该保留其父对象。因此,在图1中,document对象要保留page对象,但page对象不保留document对象。子对象对其父对象的引用是一个弱引用的例子,这部分内容在“对象的弱引用”有更充分的描述。

    保留一个对象创建了一个对该对象的“强”引用。一个对象只有在它的所有强引用都被释放后才能被回收。因此,一个对象的生命周期取决于其强引用的所有者。在某些情况下,这种行为可能并不理想。您可能想要引用一个对象而不妨碍对象本身的回收。对于这种情况,您可以获取一个“弱”引用。弱引用是通过存储一个指向对象的指针创建的,而不是保留对象。

    NSMutableArray *array;

    NSUInteger i;

    // ...

    for (i = 0; i < 10; i++) {

        NSNumber *allocedNumber = [[NSNumber alloc] initWithInteger: i];

        [array addObject:allocedNumber];

        [allocedNumber release];

    }

    在这段代码中,您需要在for循环的作用域内向allocedNumber发送release消息,以抵消之前的alloc。由于数组在用addObject:方法添加数字时对其进行了保留,因此只要它还在数组中就不会被释放。

    要理解这一点,您要把自己放在实现这种集合类的作者的位置。您要确保交给您管理的对象不能在您的眼皮底下消失,所以您要在这些对象被加入集合中时向它们发送retain消息。如果它们被删除,您还必须相应地发送release消息,并且在您自己的dealloc方法中,您还应该向其余的对象发送release消息。

    您可以使用常见的alloc和init消息来创建一个NSAutoreleasePool对象,并使用drain(如果您向一个自动释放池发送autorelease或retain消息,会引发异常—要了解release和drain之间的差异,请参考“垃圾回收”)销毁它。自动释放池应该总是在与它被创建时所处的相同上下文环境(方法或函数的调用,或循环体)中被销毁。

    自动释放池被置于一个堆栈中,虽然它们通常被称为被“嵌套”的。当您创建一个新的自动释放池时,它被添加到堆栈的顶部。当自动释放池被回收时,它们从堆栈中被删除。当一个对象收到送autorelease消息时,它被添加到当前线程的目前处于栈顶的自动释放池中。

    嵌套自动释放池的能力是指,您可以将它们包含进任何函数或方法中。例如,main函数可以创建一个自动释放池,并调用另一个创建了另外一个自动释放池的函数。或者,一个方法可以有一个自动释放池用于外循环,而有另一个自动释放池用于内循环。嵌套自动释放池的能力是一种很显著的优势,但是,当发生异常时也会有副作用

    我们通常会提及自动释放池是被嵌套的,如清单1所示。但是,您也可以认为嵌套自动释放池位于一个堆栈中,其中,“最内层”的自动释放池位于栈顶。如前所述,嵌套自动释放池实际上是这样实现的:程序中的每个线程都维护一个自动释放池的堆栈。当您创建一个自动释放池时,它被压入当前线程的堆栈的栈顶。当一个对象被自动释放时—也就是说,当一个对象收到一条autorelease消息或者当它作为一个参数被传入addObject:类方法时—它总是被放入堆栈顶部的自动释放池中。

    在垃圾回收环境中,release是一个空操作。因此,NSAutoreleasePool提供了drain方法,在引用计数环境中,该方法的作用等同于调用release,但在垃圾回收环境中,它会触发垃圾回收(如果自上次垃圾回收以来分配的内存大于当前的阈值)。因此,在通常情况下,您应该使用drain而不是release来销毁自动释放池。

  • 相关阅读:
    人月神话第二遍(总)--读书笔记
    Python实现人脸检测(个人、多人、视频)
    软件体系架构的质量属性
    jdk1.8 使用的是什么垃圾回收器?
    【深入理解Java虚拟机】垃圾回收
    P2167 [SDOI2009]Bill的挑战
    二项式反演基础
    P5039 [SHOI2010]最小生成树
    快速莫比乌斯/沃尔什变换 (FMT/FWT)
    莫比乌斯反演
  • 原文地址:https://www.cnblogs.com/worldtraveler/p/4554582.html
Copyright © 2020-2023  润新知