黑马程序员技术交流社区

标题: OC方面的基础笔记-上(转)-很不错 大家可以收藏 [打印本页]

作者: LEON27    时间: 2015-6-24 12:03
标题: OC方面的基础笔记-上(转)-很不错 大家可以收藏
1.类的基本用法
#import <Foundation/Foundation.h>
// 大体上就是include, 用于包含头文件, 但是即使头文件中, 没有ifndef defined endif, 仍然能够踢除重复包含的头文件
// ----@interface section----
// OC中声明和实现是分离的, 两个都必须有.
@interface Fraction : NSObject {    // @interface 类名: 父类名字
// 在这里声明成员变量, 在OC中称为字段, 描述类的对象的属性
// 只有成员变量需要在外部提供接口, 或者是需要被继承的时候, 才需要在.h文件中定义成员变量, 其他情况下只需要在.m文件中, 声明全局变量即可
   int _numerator;    // 在类内一律使用成员变量, 在类外使用属性
   int _denominator;
}
@property (nonatomic, assign) int numerator, denominator;
-(void) setNumerator: (int) n;        // 声明方法
-(void) setNumerator: (int) n andDenominator: (int) d;
-(Fraction *) init;    // 或者使用-(id) init; OC中只要是以init开头的都是构造函数, 可以带参数
@end

// ---@implementation section----方法的实现---实例方法(以-号开头)----类方法(以+号开头)
@implementation Fraction        // @implementation 类名
@synthesize numerator = _numerator, denominator = _denominator;
-(void) setNumerator: (int) n andDenominator: (int) d;
{
  _numerator = n;
  _denominator = d;
}
-(Fraction *) init
{
  if (self = [super init]){
  // super是指向父类的指针, super的值和self一样, Fraction中不仅有自己的成员变量, 还有父类中的内容, 因此初始化的时候, 要先初始化父类的内容, 然后再初始化自己本身的内容.
   _numerator = _denominator = 0;
  }
  return self;        // self是当前对象的地址, 也相当于一个成员变量
}

@end

// ---- program section ----主函数部分

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

   @autoreleasepool {            // 为自动释放池在内存中保留了空间

       Fraction *myFraction = [[Fraction alloc] init];        // 声明一个类的对象,分配内存空间并初始化
   // OC不允许类的对象创建在栈里, 自己写的类的对象只能创建在堆里
       // [Fraction alloc]这个表达式创建一个Fraction的对象在堆空间,表达式的值是该对象的地址, myFraction只是对象的指针
                           // 或者使用 Fraction *myFraction = [Fraction new];
       [myFraction setNumerator: 1];       // 把消息发送给对象,调用setNumerator方法,传递一个参数为1.
   // 调用myFraction指向的对象的方法setNumerator,
       // 对象的地址(不是指针)调用对象的方法, (地址是常量, 指针是变量)
       // 也叫做给对象发送setNumerator消息

     // OC完全兼容C; OC有自己专用的字符串, 同时也兼容C的字符串   
       NSLog(@"The value of myFraction is: ");      // 显示, @表示NSString型字符串对象, 不加为普通字符串   
   }
   return 0;
}

2.不可变字符串
   OC的字符串是一个对象, 它的类型是NSString类.
   OC所以会使用自己专有的字符串, 因为这个字符串是个对象, 有很多的方法, 比外来函数如strlen等更方便, 更面向对象.
   NSString * str = @"Hello World!";
   // @"Hello World!"这个表达式表示在只读数据段里, 创建了一个NSString的对象, 内容是Hello World!, 表达式的值是该对象的地址, 只有字符串可以这样创建一个对象
  // NSString的对象是不可变的
  // NSMutableString的对象是可变的

  NSString * str2  = [[NSString alloc] initWithString: str];

  NSString * str3 = [[NSString alloc] initWithUTF8String:"HEllo World!"];
  //用C的字符串创建OC的字符串, 完成C的字符串转换成OC的字符串
  char * cString = [@"Objective-C String" UTF8String];        // 将OC字符串转换为C字符串

  NSString * str4 = [[NSString alloc] initWithFormat:@"hello %c %d %f", 'A', 3, 3.14];
  // 根据格式符, 拼接创建一个字符串, 最强大

  还有类方法[NSString stringWithString: str];
      [NSString stringWithUTF8String:"hello"];
      [NSString stringWithFormat:@"hello %d", 5];

characterAtIndex
length        // 没有尾0

转换大小写:
   uppercaseString        // 全大写
   lowercaseString        // 全小写
   capitalizedString    // 单词首字母大写
比较大小:
    isEqualToString
    compare
    hasPrefix:        // 是否包含前缀
    hasSuffix:        // 是否包含后缀

查找:
    rangeOfString           查找字符串中子串的范围, range.location  range.length

提取子串:
    subStringToIndex
    subStringFromIndex
    subStringWithRange

结构体的对象能存储在栈里, 而类的对象不能存储在栈里.

3. 可变字符串
  NSMutableString : NSString
  NSString 的方法 NSMutableString 也能用
  传参的时候可以传NSString * 也可以传 NSMutableString *

  setString  设置或替换当前字符串内容  

  增:
      追加: appendString      appendFormat
      插入: insertString:  atIndex:
  删:
   deleteCharactersInRange
   生成range的函数NSMakeRange(2, 4);
  改:
   replaceCharactersInRange:  withString:
  查:
   rangeOfString

4.类别
  只有OC才有类别  (categoryName)
  类别就是类的升级补丁, 可以被继承
  类别不能用来添加成员变量, 只能添加方法(包括类方法和成员方法)

5.不可变数组
  数组的元素是任意的对象, 不仅仅局限于字符串, 数组中只装了对象的地址. 相当于指针数组.
  和C中的数组不同, 元素可以是不同类型的对象, 在结构上讲, 它是一个链表.
  initWithObjects

  使用%@打印的都是对象, 而且这个类都要有一个description方法
  -(NSString *) description;        // description方法只能这样写, 打印的是该方法的返回值, 对中文支持不好

  直接遍历:
   NSLog(@"%@", arrayName);
  枚举法遍历:  
   用当前数组创建一个枚举器(NSEnumerator *)enumerator = [array objectEnumerator], 然后调用枚举器的nextObject方法, 返回数组中每个元素的地址.
  快速枚举法:
   for (id obj in arrayName){}   
   专门用于枚举数组的for, 和平常的for不是一个. 每次循环得到一个数组元素的地址.
  循环遍历:   
   objectAtIndex:    // 返回数组中一个元素的地址   
   indexOfObject:    // 某元素的下标   
      count        // 元素个数

  [array containsObject: ]    // array中是否包含某个元素   

  componentsJoinedByString:    // 将数组中的元素组合起来
  componentsSeparatedByString:    // 分割字符串
  componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString: ]    // 使用字符分割字符串

6.可变数组
  初始化:
    initWithArray
    [arrayName  ObjectsAtIndexes]
    setArray

  枚举法遍历的时候不允许修改其中的元素及个数和顺序, 快速枚举法也不可以, 但是逆序枚举的时候reverseObjectEnumerator可以修改

  增加:
    addObject
    insertObject:  atIndex:        

  删除:
    removeObjectAtIndex
    removeObject

  exchange   replace

  排序:
    sortUsingSelector: @selector(isBigThan:)    // selector叫做选择器, 相当于成员方法的函数指针

7.SEL
SEL是一个类型, 用SEL声明的一个变量, 里面装的是消息, 如: SEL s = @selector(methodName);  // 有参数要写:, 即完整的方法名
@selector实际上返回的是名字ID; 作用是使方法可以赋值, 因此就可以传参, 即可以作为函数的参数来使用
编译器给每一个方法都分配了一个编号(0, 1, …), 叫名字ID, 不同的类中, 只要方法的名字相同, 名字ID就相同, 不同的是每个方法的入口地址不一样
[objectName performSelector: s withObject: ]    // 还原方法, 并调用, 有1个参数, 就加1个withObject, 最多支持2个
repondesToSelector:@selector()   //对象能否响应selector指定的方法

8.Class
Class也是一个类型, 是装类的变量, 如: Class cls = [ClassName class];   之后就可以用cls代替ClassName
作用是使类可以赋值, 因此就可以传参, 用于isKindOfClass: [ClassName class]    // 是否是ClassName类或其子类
isSubclassOfClass:[ClassName class]



原文链接:http://wquanfeng.blog.51cto.com/6316183/1228116
作者: XiaoBaoMi    时间: 2015-6-24 21:40
楼主总结的不错 学习了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2