objective-C 2.0

NEXT software公司开发了一套基于Unix的操作系统以及cocoa开发环境,后被苹果公司收购。

objective-C五大特性:

  • 完全兼容C
  • 面向对象
  • 单继承(OC里的函数均为虚函数、通过类别和协议实现伪多继承)
  • 动态绑定(dynamic_cast 把基类指针转化为子类指针的时候会自动做判断、ID类型 表示任意类型的对象,实现动态绑定)
  • 消息机制(SmallTalk语言 解决空指针错误崩溃)函数基于消息机制,发消息再调用函数
#import <Foundation/Foundation.h>

//:表示公有继承
@interface Person : NSObject
{
    //属性,实例变量,默认权限为protected
    int age;
    //对象声明时必须使用*
    NSString * name;
}  
//生成set和get方法,nonatomic表示非多线程,assign直接赋值,strong强引用 weak弱引用 retain copy,若自己重写set,get方法会自动覆盖系统生成的默认方法,还可增加readonly属性使其只生成get函数,新的编译器甚至支持省去实例变量的声明和@systhesize
 @property (nonatomic,assign) int age; // - 表示实例的方法(消息),+ 表示类的方法(消息)static - (void)eat;
- (void)setName:(NSString *)nameValue;
@end
#import "Person.h"

@implementation Person

@synthesize age; - (void)eat { NSLog(@"eat function called"); } - (void)setName:(NSString *)nameValue { if (nameValue) { //1.指针不能直接赋值,否则释放时会出现问题 2.stringWithString 方法实现NSString对象的初始化 if (name != nameValue) { name = nil;
          name
= [NSString stringWithString:nameValue]; } } } @end
#import "Person.h"
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    @autoreleasepool
    {
        //alloc为+方法即类方法,init为-方法,用类方法创建的对象会被添加到自动释放池,用实例的方法创建的对象,需要手动的去释放。
        Person * p = [[Person alloc]init];
        
        [p eat];
        //oc字符串必须以@开头
        [p setName:@"yangjing"];
    }
    return 0;
}
  • OC中无引用 
  • %@占位符表示对象
  • OC中数组不会默认初始化为零
  • 使用.运算符可以自动调用set,get方法
  • OC可以使用C风格的函数
  • OC函数名相同,参数个数不同可以重载,但若仅有参数类型不同则不能重载!因为OC通过参数的标签识别函数重载(即可以使用参数标签实现与C++类似的函数参数个数相同类型不同的函数重载)
  • 注意如果不声明实例变量而直接使用@property生成的是备份变量名,直接调用时记得在变量名前加下划线或使用self.或[self ]调用
  • self和this的区别:this永远是当前对象的指针不可以改变,而self可以修改它的值因此未必一定指向当前对象,在使用时要注意。
  • 前置声明@class和包含头文件不同,它只是声明这是个类不清楚类的结构,用于在.h文件中声明指向对象的指针,在.m文件引用其方法时仍需import
  • 不使用arc(自动释放内存)机制时需析构函数dealloc。当一个对象释放[p release]时和对象的引用计数器值为零时自动调用dealloc释放内存
原文地址:https://www.cnblogs.com/jenayfighting/p/5339351.html