oc的基础知识收集

Objective-C中.h、.m、.mm的区别


.h :头文件。头文件包含类,类型,函数和常数的声明。 
.m :源代码文件。这是典型的源代码文件扩展名,可以包含Objective-C和C代码。 
.mm :源代码文件。带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名

当你需要在源代码中包含头文件的时候,你可以使用标准的#include编译选项,但是Objective-C提供了更好的方法。#import选项和#include选项完全相同,只是它可以确保相同的文件只会被包含一次。Objective-C的例子和文档都倾向于使用#import。


nil:指向oc中对象的空指针


Nil:指向oc中类的空指针


NULL:指向其他类型的空指针,如一个c类型的内存指针


NSNull:在集合对象中,表示空值的对象


若obj为nil:

[obj message]将返回NO,而不是NSException

若obj为NSNull:

[obj message]将抛出异常NSException



Object-C @property 小结

OC像iphone手机一样与众不同,虽然有很多优秀的地方,对于刚接触的人还是有很多不适应。自己做iphone开发不久,之前对@property使用有很多不解,现在把自己理解的做下小结:


        一、@property 是什么?

        简单点说,属性就是一种支持访问对象成员变更的快捷的方法,可以自动的生成setter和getter方法(setter只支持传一个参数)。

        面向对象思想的基本特点为封装、继承、多态。封装性主要体现在无法直接访问对象成员变量,如果需要的话,通过setter和getter方法访问成员变量。这样的话,通常要为每一个支持外边访问的成员变量写两个方法,这种操作比较繁琐且无意义。通过@property可以简化这种方法。

        声明:属性要在头文件中声明,声明格式为: @property (attributes) type propertyName; 

        实现(合成):实现要在.m文件中,格式为 @synthesize   name = _name; 而在xcode4.4以后的版本,系统会自动合成, 等价于自己写了代码“ @synthesize  name = _name;” 。 也就是说如果没有特殊需求,只需要在头文件中声明而无需实现,就可以直接使用了。

        成员变量访问权限:头文件中声明的成员变量,默认是protected,.m文件中声明的成员变量,默认是private的。合成属性时,@synthesize  propertyName = _name;如果变量_name没有声明,系统会自动生成该成员变量且为private权限。如果_name已声明,它们会自动合成。

ClassA.h

[html]  view plain  copy
  1. @interface ClassA : NSObject {  
  2.     int _int4; //默认为protected  
  3. @public    //可以通过这种方式指定成员变量的访问权限  
  4.     int _int1;  
  5.     int _int5;  
  6. @protected  
  7.     int _int2;  
  8. @private  
  9.     int _int3;  
  10. }  
  11. @property int int1;  
  12. @property int int5;  
  13. @property int myPro;  
  14.   
  15. @end  

ClassA.m

[html]  view plain  copy
  1. @implementation ClassA{  
  2.     int _intPrivate;//此处声明的变量为private的  
  3. }  
  4. @synthesize int1=_myInt8;//_myIn8没有声明,会自动成生,在此类中可以访问  
  5.                          //成员变量 _int5 会被自动合成到属性,可以在外部通过“obj -> _int5"的方式直接访问。  
  6.                          //系统会自动生成_myPro,只在本类中可以访问  
  7. @end  


        二、使用

        声明一个属性,如果没有声明为只读的,它默认会生成两个方法 - (type)name 和 - (void)setName; 为了可读性等其它原因,也可以改变属性的setter和getter访问名称,

@property  (setter=setMyValue, getter=getBool) NSInteger  value;

这样的话就可以通过 [obj setMyValue:10] 和 [obj getBool]方法业访问成员变量了,此时setValue方法会被覆盖,不再存在。


        三、@property的修饰属性(attributes )

        可读性:readwrite / readonly ,不写的话默认为readwrite,即会合成setter和getter方法。

原子性:nonatomic / 【默认】,系统默认setter和getter为原子操作(没有atomic关键字),如果想设置为非原子操作,可以nonatomic。       

        内存 assign / retain / weak / strong ,在非ARC环境下, assign为默认,引用计数不变;retain引用计数加1;在引用计数环境下,默认为strong,与retain作用相同;从5.0系统后引入了weak,作用与assign相似,不过当所指向对象引用为0时,自动置为nil。


Object-c基础之三:面对对象开发@interface,@implementation


1.@interface

Java等语言编程中,创建类都是用class,但在object-c中,用@interface。

例子:

@interface circle :NSObject    //定义名为circle的类,继承自NSObject

{

            ShapeColorfillColor;//定义ShapeColor类型的实例变量 fillColor;

            Shapebounds;//定义Shape类型的实例变量 bounds;

}

- (void)setFillColor:(ShapeColor)fillColor;//定义名为setFillColor的方法

 

 

2.@implementation

在object-c中,@interface定义放在.h文件中,而@implementation放在.m 文件,是.h文件的详细实现。

例子:

@implementation circle //结尾没有分号。

 

- (void)setFillColor:(ShapeColor)c

{

            fillColor= c;//把参数c赋值给@interface中定义的fillColor;

}

3.实例化对象

为了使用我们已经定义的类,我们需要实例化对象,我们可以在我们创建的文件中的main()函数实例化:如下

int main(int argc, const char * argv[])

{

            idshapes[3];//定义id类型数组

 

            shapes[0]= [circle new];//实例化circle并赋值给shapes

            [shapes[0]setFillColor:kRedColor];//调用方法进行赋值

}



 iOS 【UIKit-UIImage渲染模式 imageWithRenderingMode:】


设置UIImage的渲染模式:UIImage.renderingMode

着色(Tint Color)是iOS7界面中的一个设置UIImage的渲染模式,你可以设置一个UIImage在渲染时是否使用当前视图的Tint Color。UIImage新增了一个只读属性:renderingMode,对应的还有一个新增方法:imageWithRenderingMode:,它使用UIImageRenderingMode枚举值来设置图片的renderingMode属性。该枚举中包含下列值:

  1. UIImageRenderingModeAutomatic  // 根据图片的使用环境和所处的绘图上下文自动调整渲染模式。  
  2. UIImageRenderingModeAlwaysOriginal   // 始终绘制图片原始状态,不使用Tint Color。  

  3. UIImageRenderingModeAlwaysTemplate   // 始终根据Tint Color绘制图片,忽略图片的颜色信息。  



比如说我们设置这么一句话:

childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectImage] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];


设置与不设置的区别:

设置时:


未设置时:


我们发现图片的原始状态是橙色,设置渲染时始终绘制图片的原始状态就是上面的效果了。而下面蓝色的效果是apple原来就有的。


[IOS] 图片显示 imageNamed, initWithContentsOfFile 的区别

1.用imageNamed方法

[UIImage imageNamed:ImageName];

此方法为常见方法,利用它可以方便加载资源图片。用imageNamed的方式加载时,会把图像数据根据它的名字缓存在系统内存中,以提高imageNamed方法获得相同图片的image对象的性能。即使生成的对象被 autoReleasePool释放了,这份缓存也不释放。而且没有明确的释放方法。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存。

2.用 imageWithContentsOfFile 方法

NSString *thumbnailFile = [NSString stringWithFormat:@"%@/%@.png", [[NSBundle mainBundle] resourcePath], fileName];
UIImage *thumbnail = [UIImage imageWithContentsOfFile:thumbnailFile];

此方法加载的图片是不会缓存的。得到的对象时autoRelease的,当autoReleasePool释放时才释放。

3. 用initWithContentsFile方法

UIImage *image = [[UIImage alloc] initWithContentsOfFile:filePath]

此方法要手动release掉。不系统缓存。release后立即释放,一般用在封面等图比较大的地方。



UITableView NSIndexPath属性讲解

NSIndexPath 是一个对象,它用来表示一个树形的记录地址。

提到UITableView,就必须的说一说NSIndexPath。UITableView声明了一个NSIndexPath的类别,主要用 来标识当前cell的在tableView中的位置,该类别有section和row两个属性,前者标识当前cell处于第几个section中,后者代 表在该section中的第几行。

  UITableView只能有一列数据(cell),且只支持纵向滑动,当创建好的tablView第一次显示的时候,我们需要调用其reloadData方法,强制刷新一次,从而使tableView的数据更新到最新状态。

NSIndexPath的创建

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];

-(void)cellImageDidLoad:(NSIndexPath *)indexPath image:(UIImage *)image
{
    UITableViewCell *cell = [wqTablecellForRowAtIndexPath:indexPath];
    cell.imageView.image = image;
}

UISegmentedControl的基本用法

        

 @UISegmentedControl类似于UIButton,它可以提供多个选择操作,响应事件,但具有很大的局限性,我们更多的是使用自定义的,不过在这里还是介绍下它的基本用法.


[objc]  view plain  copy
  1. NSArray *segmentedArray = [[NSArrayalloc]initWithObjects:@"1",@"2",@"3",@"4",nil];   
  2. //初始化UISegmentedControl   
  3. UISegmentedControl *segmentedControl = [[UISegmentedControlalloc]initWithItems:segmentedArray];   
  4. segmentedControl.frame = CGRectMake(20.0,……)  
  5. // 设置默认选择项索引   
  6. segmentedControl.selectedSegmentIndex = 2;  
  7. segmentedControl.tintColor = [UIColor redColor];   
  8. // 有基本四种样式  
  9. segmentedControl.segmentedControlStyle = UISegmentedControlStylePlain;  
  10. segmentedControl.segmentedControlStyle = UISegmentedControlStyleBordered;  
  11. segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;  
  12. segmentedControl.segmentedControlStyle = UISegmentedControlStyleBezeled;  
  13.   
  14.   
  15. // 设置在点击后是否恢复原样      
  16.  segmentedControl.momentary = YES;  
  17.  [segmentedControl setTitle:@"two" forSegmentAtIndex:1];//设置指定索引的题目   
  18.  [segmentedControl setImage:[UIImage imageNamed:@"btn_jyy.png"] forSegmentAtIndex:3];//设置指定索引的图片   
  19. // 在指定索引插入一个选项并设置图片  
  20.  [segmentedControl insertSegmentWithImage:[UIImage imageNamed:@"mei.png"] atIndex:2 animated:NO];  
  21. // 在指定索引插入一个选项并设置题目   
  22.  [segmentedControl insertSegmentWithTitle:@"insert" atIndex:3 animated:NO];  
  23.   
  24. // 移除指定索引的选项   
  25.  [segmentedControl removeSegmentAtIndex:0 animated:NO];  
  26. // 设置指定索引选项的宽度   
  27.  [segmentedControl setWidth:70.0 forSegmentAtIndex:2];  
  28. // 设置选项中图片等的左上角的位置   
  29.  [segmentedControl setContentOffset:CGSizeMake(10.0,10.0) forSegmentAtIndex:4];  
  30.   
  31.  //获取指定索引选项的图片imageForSegmentAtIndex:   
  32.  UIImageView *imageForSegmentAtIndex = [[UIImageViewalloc]initWithImage:[segmentedControl imageForSegmentAtIndex:1]];   
  33.  imageForSegmentAtIndex.frame = CGRectMake(60.0120.030.030.0);  ;  
  34.   
  35.  //获取指定索引选项的标题titleForSegmentAtIndex   
  36.  UILabel *titleForSegmentAtIndex = [[UILabel alloc]initWithFrame:CGRectMake(100.0160.030.030.0)];   
  37.  titleForSegmentAtIndex.text = [segmentedControl titleForSegmentAtIndex:0];   
  38.   
  39.  //获取总选项数segmentedControl.numberOfSegments   
  40.  UILabel *numberOfSegments = [[UILabel alloc]initWithFrame:CGRectMake(140.0170.030.030.0)];   
  41.  numberOfSegments.text = [NSString stringWithFormat:@"%d",segmentedControl.numberOfSegments];  
  42.   
  43.  //获取指定索引选项的宽度widthForSegmentAtIndex:   
  44.  UILabel *widthForSegmentAtIndex = [[UILabel alloc]initWithFrame:CGRectMake(180.0210.070.030.0)];   
  45.  widthForSegmentAtIndex.text = [NSString stringWithFormat:@"%f",[segmentedControl widthForSegmentAtIndex:2]];   
  46.    
  47. // [segmentedControl setEnabled:NO forSegmentAtIndex:4];//设置指定索引选项不可选   
  48. // BOOL enableFlag = [segmentedControl isEnabledForSegmentAtIndex:4];//判断指定索引选项是否可选   
  49.    [mySegmentedControladdTarget:selfaction:@selector(didClicksegmentedControlAction:)forControlEvents:UIControlEventValueChanged];    
  50.   
  51. oid)didClicksegmentedControlAction:(UISegmentedControl *)Seg{  
  52.  NSInteger Index = Seg.selectedSegmentIndex;  
  53.  NSLog(@"Index %i", Index);  
  54.  switch (Index) {  
  55.      case 0:  
  56.          [self selectmyView1];  
  57.          break;  
  58.      case 1:  
  59.          [self selectmyView2];  
  60.          break;  
  61.      case 2:  
  62.          [self selectmyView3];  
  63.          break;  
  64.      case 3:  
  65.          [self selectmyView4];  
  66.          break;  
  67. …………………………….  
  68.      default:  
  69.          break;  
  70.  }  


Objective-C中的dictionaryWithObjectsAndKeys:方法

 

Objective-C中的dictionaryWithObjectsAndKeys:方法
    dictionaryWithObjectsAndKeys:方法的功能是创建字典,此字典具有多个值和多个键。与dictionaryWithObjects:唯一不同的是,这多个值和键没用放在数组中,而是直接进行了使用,其语法形式如下:
  

+ (id)dictionaryWithObjectsAndKeys:(id)firstObject, ...;

       其中,(id)firstObject用来指定值和键,首位为值,第二位为键,第三位又为值,以此类推。
       【示例】以下程序通过使用dictionaryWithObjectsAnd Keys:方法创建一个具有多个值和多个键的字典,并输出。程序代码如下:
    #import
    int main(int argc, const char * argv[])
    {
    @autoreleasepool {
    NSDictionary *d=[NSDictionary dictionaryWithObjectsAndKeys:@"One",@"1",@"Two",
    @"2",@"Three",@"3",@"Four",@"4", nil];//创建具有多个值和键的字典
    NSLog(@"%@",d);
    }
    return 0;
    }

    运行结果如下:

    2013-03-22 00:02:03.503 6-7[1788:303] {
    1 = One;
    2 = Two;
    3 = Three;
    4 = Four;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值