OC语法基础之一

本文深入探讨了Swift与Objective-C的区别与联系,包括语法、性能、生态系统和开发者社区的对比,帮助开发者更好地理解这两种语言的特点与适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 //block遍历 效率最快
    [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        //obj 数组的元素  idx 数组的索引  *stop是否停止遍历
        if ([obj isEqualToString:@"2"] == YES) {
            //*stop 等于YES 遍历停止
            *stop = YES;
        } 
    }];
 //快速遍历
    for (NSString * str in arr) {   
    }
    NSDictionary *dic;
    //字典block遍历
    [dic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
       //key 字典的key键  obj 字典的value值  
    }];

ID类型声明的对象不能使用点语法,可以使用set方法,id不能确定类型,所以找不到相应的类,也就找不到相应的对象。
打印BOOL类型用%hhd
添加数组元素[array oddobject:@“A”];
[str1 UTF8String]//字符串转换成C字符串
[obj respondsToSelector:sel]判断obj中有没有sel这个方法
// isMemberOfClass: 判断对象是否是某个类的对象
//使用performSelector来执行sel变量对应的方法
===========================================================================
instance 只能作为返回值不能作参数
instance 只能返回当前对象类型的对象
id能返回未知类型的对象
id可以作为返回值,也可以作为参数
Nsobject定义子孙类对象必须进行类型强转
id定义子孙类对象不需要类型强转
一个对象能不能调用某个方法不由编译器决定,由运行时决定
========================================================================
 BOOL isrespond=[Dog instancesRespondToSelector:@selector(eat)];
判断类中有没有指定的方法
BOOL isrespond= [ani respondsToSelector:@selector(eat)];
判断实例对象能否(响应)指定的方法
BOOL isKind= [ani isKindOfClass:[Animal class]];
判断实例对象是否是这个类或者这个类的子类的实例
isKind=[dog isMemberOfClass:[Animal alloc]];
判断对象是否是某个类的实例对象
BOOL isSub=[Dog isSubclassOfClass:[Animal class]];
判断一个类是不是另一个类的子类
[ani performSelector:@selector(eat)];
判断ani能否响应某个方法
==========================================================================
@property属性。
 atomic 对属性加锁,多线程下线程安全,默认值
 nonatomic对属性不加锁,多线程下不安全,但是速度快
 readwrite  生成getter\setter默认值
 readonly   只生成getter方法
 weak: 在arc模式下,效果相当于assign,但还比assign多一个功能
 strong:在arc(自动内存管理模式下,效果相当于retain
 set方法处理
 assign直接赋值,默认值,适用于直接赋值。
 retain 先release原来的值,再retain新值,适用于OC对象
 copy   先release原来的值,再copy新值
=============================================================================
分类—-(category)就是在不修改原有类的基础上给类增加新的方法。
使用步骤:声明一个分类,实现这个分类,使用分类中的方法
新建分类文件时,给谁增加分类就继承于谁。
@interface Person(playGame)声明和实现格式无非就是加了一个括号和文件名,在main函数中需要包含头文件。
1.分类只能增加方法,不能增加成员(实例)变量
2.分类中可以访问类中的实例变量
3.如果分类中和类中有同名的方法,优先访问分类中的方法
4.如果有两个分类中都有同名的方法,执行的是最后编译的那个类别的方法,编译顺序在系统配置中查看
==============================================================================
非正式协议:所谓非正式协议就是类别,即凡是NSObject或其子类的类别,都是非正式协议
凡是NSobject以及其Fundation框架中的增加的类都叫非正式协议。
比如:给NSobject增加一个新的分类,类里增加的所有的方法main函数中的对象都可以使用
如:NSString+countNum非正式协议   Person+countNum就是分类
如果分类声明时继承于nsstring,那么程序中用nsstring定义的字符都可以当作对象调用分类中的方法
===========================================================================
延展是一个特殊的分类,也叫类扩展
@interface Person()匿名分类,可以用来声明实例变量,但方法的实现只能在实现的原实现文件中实现,不能使用@implementation Person()实现
用@interface Person()在.m的文件里进行声明一般来说是私有实例变量
============================================================================
@class XXXX的使用
可以简单的引入一个类,含义就是告诉编译器引入的是一个类,至于类中有哪些方法和属性,此处编译器不去检测。
好处:如果引入的xxxx文件发生变化,不需要重新编译。可以解决交叉引用出错。必须有一方用@class
使用方式
@class AA; 在.h文件里
#import “AA.h” 在.m文件里
================================================================================
Block使用
 int (^block)(int,float)=^(int a,float b);
block1=^(int a,float b);重新赋值
 在block内部不能修改block外部变量的值(全局变量除外)。如果要修改外部变量用__block修饰。用__block修饰的变量放在堆区,而不放在栈区
block分为全局block,堆block,栈block
inlineBlock  Block助记符
==================================================================================
内存管理
凡是使用alloc、new(或者new开头的方法)、copy(或者copy开头的方法),mutableCopy(或者mutableCopy的方法)、retain创建的对象都需要手动release(引用计数为0会被自动释放
Xcode5之后默认自动管理,手动关需要修改【工程】 — Build Settings —搜索gar — YES改成NO
ARC非ARC混编 Build phase ——> Complie Source ———> -fno-objc-arc

 3.1四个关键字
__strong(强引用) 缺省属性,其修饰的对象指针,指向哪个对象,会对该对象retain,离开哪个对象,会对该对象release。

__weak(弱引用)其修饰的对象指针,指向任何对象都不会retain。这样的指针指向的对象随时可能消失。如果对象消失了,这个指针会自动变成nil。
//在iOS编程中,代理对象使用弱引用。

__unsafe_unretained 其修饰的对象指针,指向任何对象都不retain。当指向的对象消失,该指针不会变成nil,仍然指向已经释放的对象  // 会变成野指针

__autoreleasing 只用来修饰需要被传入地址的指针。如:
__autoreleasing NSError * error;   &error;   //写不写都一样,所以还是不写

=========================================================================================
NSNumber 继承自NSValue
int i=88;
    //将int封装成一个oc对象v1
    NSValue *v1=[[NSValue alloc]initWithBytes:&i objCType:@encode(int) ];    
    //从一个oc对象得到int类型
    int ret;
    [v1 getValue:&ret];
    NSLog(@"ret=%d\n",ret);
NSNumber提供了对基本数据类型一步到位的封装
NSNumber*n1=[NSNumber numberWithInt:i];
NSLog(@"n1.intValue=%d", n1.intValue);

三种写文件的方式:
1.NSFileManager (文件可以不存在,不存在会创建)
NSString * str =@"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值