IOS开发学习笔记(二十二)——ObjectC语言难以理解的概念汇总

Object-C语言详解 Object-C,通常写作Objective-C(简称ObjC或OC),是一种扩充C的面向对象编程语言。它是在C语言的基础上添加了Smalltalk风格的消息传递和反射机制,从而具备了面向对象的特性和优势。Objective-C的流行主要得益于苹果公司的成功,尤其是iPhone和iPad等移动设备的普及,使得Objective-C成为iOS和macOS平台应用开发的首选语言。 阅读详情

这篇文章将会对ObjectC语言中比较难理解的概念进行汇总,帮助我们更好的进行iOS开发。


方法&成员变量&属性

我们首先看一个很简单的方法代码:

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath;


对于我这种用了多年C/C++和Java的程序员来说,实在比较难以理解,但是换个角度可以这样理解:

  1. 方法名称你可以认为是dequeueReusableCellWithIdentifier_forIndexPath;
  2. 参数有两个,第一个是NSString *类型,名字叫identifier;第二个是NSIndexPath *类型,名字叫indexPath;
  3. 最顶头的减号("-")标识是object方法,如果是加号("+")标识是静态(static)方法;
  4. 属性通过@private定义,并且需要你自己去显式通过实现方法来存取,或者.h文件中指定@property,.m文件中指定@synthesize来使得可以通过self.propertyName访问;
  5. 可以指定readonly指示符指示仅生成get方法;
  6. 注意对于静态方法(类方法)可以使用self或者super关键字指定使用自己还是父类的静态方法;

属性

对于属性中可能使用到的几个关键字我们这样理解:

  1. nonatomic关键字说明这个是非原子操作的,所以可能是非线程安全的;
  2. strong和weak关键字在所指定的属性是对象类型时使用。strong表示保持这个对象的指针所指向的内存,一直到使用结束;weak表示如果没有人再使用这个指针,那么就设置为nil;官方的解释是这样滴:
    strong is the default. An object remains “alive” as long as there is a strong pointer to it.
    weak specifies a reference that does not keep the referenced object alive. A weak reference is set to nil when there are no strong references to the object.
    另外还有一个比喻:
    我们的属性可以认为是一条狗,他总是想逃跑;strong可以认为是狗链子,我们可以用多条链子拴住这条狗,只要有一条还抓在我们手里,狗就跑不了;而weak是一个看着狗的孩子,当链子在我们手中的时候,孩子可以看住狗,但是当链子不在我们手中时,狗就可以跑掉,尽管孩子在看着狗。
    .h
    @interface ViewController : UIViewController
    
    @property (nonatomic, strong) MyType *obj1;
    @property (nonatomic, weak) MyType *obj2;
    
    @end
    注意obj2是strong还是weak对程序运行结果的影响。
    .m
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    	// Do any additional setup after loading the view, typically from a nib.
        obj1 = [[MyType alloc] init];
        obj2 = obj1;
        
        obj1 = nil;
        NSLog(@"obj2 = %@", obj2);
    }
    注意weak是在iOS5以后引入的,所以如果你的代码需要在iOS4上面运行,你只能使用strong。
  3. 上面讲得实际上就是引用计数的概念,strong类型的对象会被加上引用计数,当最后一个对象不再保留引用计数的时候,strong的对象就会被自动释放,所以这个时间点相对垃圾回收机制来说是可预期的;
  4. 局部变量由于在方法执行结束后超出其作用于,所以会被自动清除引用计数;
  5. 对于非ARC的程序,weak对应的关键字是unretain,strong对应的是retain关键字;另外还有一个关键字unsafe_unretain这个会造成野指针,不推荐使用,就不赘述了;
  6. 所有的属性,在你没有设置默认的setter的时候,初始化的值都是0;
  7. 可以使用if (obj)判断对象是否是nil,但一般情况下你无须这样去做。对一个nil的对象做一个操作(例如调用一个方法)将不会真正去执行这个方法,如果这个方法是有返回值的,一般都会返回0;但是如果这个方法是返回一个C类型的结构值的,那么你需要自己去事先检查这个对象是否是nil,因为无法保证返回的结构中的成员变量是有效的还是无效的,可能是一堆垃圾数据;



对于如何使用方法/成员变量/属性,建议采用如下规则:
  1. 所有的实例变量都声明为:@private;
  2. 所有属性都是用@property定义,并在方法中采用self.property或者super.property的方式引用;
  3. .m文件中使用@synthesize使得编译器将setter和getter设置为与property同名的方法;
  4. 注意有这样的方法,可以强制你必须在代码中使用self.property的方式使用属性,在.m文件的interface段内这样写:
    @interface MyViewController ()
    @property int myPriveteProperty;
    @end

    这样你在方法中必须使用self.myPrivateProperty这样的方式来引用成员变量。
  5. 注意在对象使用前最好检测是否是nil,因为对于object.property的使用形式,如果object本身是nil,并且property本身是一个CType的一个结构类型变量,那么property本身的值是未知的,可能会导致不可预知的错误;
  6. 对于需要打印输出的对象,可以重写-(NSString *)description方法(类似于java中的toString),并且可以在NSLog()中使用%@输出;


变量类型

对于变量类型有几个需要注意的地方:

  1. Java中我们是可以定义一个String类型的变量(或者任意一个对象类型的变量),但在ObjectC中我们的对象必须使用指针类型定义:NSString *str;
  2. id类型返回任意一个对象类型的变量,类似于Object。但注意:返回的仍然是一个指针,类似于NSString *;
  3. 事件响应方法:IBAction返回值类似于void;
  4. 注意BOOL类型的变量是YES/NO,不再是TRUE/FALSE;


访问控制符

访问控制符有几个需要注意的,我列举如下:

  1. ObjectC的默认访问控制符是@protected的,当然你也可以定义为@private或者@public;

动态类型Dynamic Type

这里面最需要讨论的就是内省(Introspection):

  1. isKindOfClass对于有java经验的我来说很好理解,可以理解为一个类是否是一个另一个类或其父类的实例;
  2. isMemberOfClass就比较诡异了,是返回一个object是否这个类的实例,注意这里不检测继承关系,也就是说[teacher isMemberOfClass: [Teacher class]]返回YES,但是[teacher isMemberOfClass: [Person class]]返回NO。
    注意看下面的代码:
        obj1 = [[MyType alloc] init];
        NSLog(@"obj1 isKindOfClass:NSObject = %@", ([obj1 isKindOfClass:[NSObject class]]) ? @"YES" : @"NO");
        NSLog(@"obj1 isMemberOfClass:NSObject = %@", ([obj1 isMemberOfClass:[NSObject class]]) ? @"YES" : @"NO");
        NSLog(@"obj1 isMemberOfClass:MyType = %@", ([obj1 isMemberOfClass:[MyType class]]) ? @"YES" : @"NO");

  3. ObjectC中有一种特殊的表达式:[tester respondsToSelector:@selector(test:)],其中的@selector是一个SEL类型,前面的表达式表示检查tester这个object有没有提供一个名字叫"test"的方法,注意表达式上"test"后面是有冒号的;

注意另一个问题,如果一个对象被设置为nil,那么以上的这些操作对于这个对象来说返回都是NO;


集合类型

集合类型使用的时候需要注意:

  1. NSArray/NSDictionary/NSSet等都是不可变的集合类型,意思是在创建的时候就初始化内容,并且以后不可以再增加/删除内容;
  2. NSMutableArray/NSMutableDictionary/NSMutableSet等是可变集合,分别类似于Java中的数组/Map等集合类型;





总体来说,ObjectC和C/C++/Java这些语言有类似的地方,但差异较大,过渡过来的学习曲线还是比较陡峭的,但只要抓住差异注意理解,上手还不是那么难,关键在于理解。


深入理解iOS中的视频播放与管理 本章深入探讨了如何在iOS中管理视频播放器,包括视频文件的加载、播放、缩略图捕获以及与iPod库的交互。我们学习了如何创建和控制MPMoviePlayerController实例,处理视频播放结束的回调,以及如何使用MPMediaPickerController让用户选择iPod库中的内容。这些内容对于开发需要视频播放功能的iOS应用至关重要。 阅读详情

相关推荐

基于FPGA的心电信号实时处理与智能诊断系统实现【附源码解析】

本文详细介绍了基于FPGA的心电信号实时处理与智能诊断系统的设计与实现。系统通过高精度采集电路和FPGA数字滤波技术处理微弱心电信号,采用自适应算法准确检测QRS波群,实现心率计算和心律异常诊断。附源码解析展示了FIR滤波器、中值滤波器和诊断逻辑的Verilog实现,为心电监护系统开发提供实用参考。

g8f9d0s1a2的博客 770

为什么Objective-C很难

2012-03-07 13:43 junwong 开源中国社区 我要评论(3) 字号:T | T 作为一个Objective-C的coder,我总能听到一部分人在这门语言上抱怨有很多问题。他们总在想快速学习这门语言来写一个App出来,但他们也总是联想到Objective-C看上去实在太难了或者在想这些语法符号都是神马玩意?不错,他们问得非常好,所以本人也解释一下为什么很多程序员相比较学

ouxiang08的专栏 640

Linux之SUSE系统SAP-HANA经常系统内存不足使得SAP应用不能使用解决方案

问题描述 Linux内存使用量超过阈值,使得sap应用程序无可用内存,最终导致程序崩溃。 问题原因 自己查阅了一些资料,也基于zabbix的可用内存和实际不太一样入手去找原因发现问题出现于Cached的值过大,导致系统没有可以再分配的内存空间。Cached只要用来缓存文件的,经常读写的文件会被缓存到Cached中,可以增加读写效率,该功能是Linux系统内核提供的,而SAP-HANA的日志文件很大...

liuxiangyang_的博客 6710

C++ 中的类(class)和对象(object)详解

类是具有相同的属性和操作的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性(数据变量)和操作(成员函数)两个主要部分。 简而言之,类可以理解成是一种用户自己构造的数据类型,用这种数据类型声明的变量被称为 “对象”。类和结构体的区别那么类(class)和结构体(structure)有什么区别呢?结构体(structure)是一个包含了一个或者多个变量的集合,而且这些变量还可能是不同类型。结构体将其聚集,放在一个名称下面,这样方便使用。析构函数 构造函数

ZhongUncle的博客 9569

altium room 布局_ALtium 16相同重复模块PCB布局,复制布局走线

自己做了实际工程以后发现PCB器件名字后缀太长了,所以文章最后写了一下后缀的调整方法。第一种方法:1、建立子原理图如下,文件名CANM 2、之后新建一个顶层文件,文件名TOP,之后design—create sheet symbol form sheet or hdl。选择CANM,并放置到TOP中,如下 3、由于我们要多次调用CANM所以使用repeat命令修改如下: 4、之后根据自己的定义,连...

weixin_39609573的博客 5749

C语言之对象(object)和变量(variable)的区别和联系

一、C语言中对象(object)的概念 注意,这里的对象可不是面向对象概念的对象哦!!! 参考链接: 《C++ difference between variable and object》 《对象和变量的区别》 《C++变量和对象的区别联系》 参考书籍: 《品悟C -- 抛弃C程序设计中的谬误与恶习》 《标准C语言指南》 Class A size=8 align=...

astrotycoon 4868

第八篇 永磁同步电机控制-MTPA、MTPV

MTPA 的全称是 Maximum Torque Per Ampere,即 最大转矩电流比控制。核心思想:在输出特定转矩时,通过控制定子电流的幅值和相位(即d轴和q轴电流的分量),使得所需要的定子电流幅值最小。通俗理解:就是用“最省电”的方式产生所需要的力矩。就像开车时,找到一个最合适的油门和档位配合,使得在输出相同动力时,油耗最低。

深耕汽车电子:AUTOSAR、电机控制,助力数字汽车 1870

第一篇 Object-C快速入门

Object-C是OS X和iOS上的主要程序开发语言。它是C语言的超集,提供了面向对象和动态运行时的功能。Object-C继承了C语言的语法、基本类型和流程控制语句,同时添加了定义类和方法的语法。当进行动态类型识别和绑定的时候,Object-C还添加了对象结构管理和对象语法的语言层面的支持,将很多工作延迟到了运行时进行处理。

陶罐的程序世界 3万+

手把手教你用RMII接口配置以太网PHY芯片(附YT8512实战代码)

本文详细介绍了如何使用RMII接口配置以太网PHY芯片,以国产YT8512为例,提供从硬件设计到软件驱动的全流程实战指南。内容包括RMII接口技术解析、YT8512硬件设计要点、驱动开发实战代码及常见问题排查,帮助开发者快速实现以太网通信功能。

mac99的博客 995

Android 12 系统横屏时,开机动画有两秒显示不全

平板系统默认横屏时,开机会旋转90度,显示的分辨率WxH,会变成HxW.但又会很快被SurfaceFlinger的SurfaceFlinger::processDisplayChanged 娇正。所以为了保险,可以在开机动画没结束之前,禁止旋转事件。在Android 12 产品定制化开发中,由于系统默认方向为竖屏,平板电脑要横屏显示。系统在开机时,有时因为旋转,会出现动画只显示一部分。

448313096@qq.com 1180

douyin-ios-objectc:10分钟快速上手iOS抖音仿制项目

douyin-ios-objectc是一个基于Objective-C开发的iOS抖音仿制项目,让开发者能够快速了解短视频应用的核心架构与实现原理。本文将带你10分钟内完成项目环境搭建,掌握关键功能模块的使用方法。 ## 🚀 项目核心功能概览 该项目完整复刻了抖音的核心交互逻辑,主要包含三大功能模块: - **短视频流播放**:支持上下滑动切换视频、点赞评论等互动操作 - **用户主页**:

gitblog_00683的博客 850

OpenClaw 子代理配对失败问题分析与解决方案

OpenClaw子代理配对失败问题分析与解决方案 问题核心在于agent设备权限不足,仅有operator.approvals权限而缺少operator.admin权限,导致子代理启动时形成权限死锁。本文提供三种解决方案: 直接编辑设备配对文件(推荐):修改本地JSON文件,为agent设备添加完整operator.admin权限,操作简单快捷。 标准重新配对流程:删除现有agent设备后重新配对,通过正常审批流程获取完整权限,符合系统安全设计。 修改源码降低权限要求(仅限开发环境):调整子代理代码避免强制

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 148

IOS开发学习笔记(一)——ObjectC语言快速入门

需要学习IOS开发,首先需要掌握的是ObjectC语言。由于我之前接触过多年的C/C++和Java,所以很多地方我只需要理解ObjectC和他们的不同即可。当然为了能够系统的学习,建议您还是仔细学习一遍ObjectC语言,我这里并不会讲述太多原理方面的内容,只会尽量将实际编码中需要注意的内容列出: 基本的关键字,类似于for/case/switch等等,大家都是差不多的;“@”标识符标识

「行到水穷处,坐看云起时」 4960

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

iOS开发ObjectC内存管理

iOS开发ObjectC内存管理我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上)。如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存。其他高级语言如C#、Java都是通过垃圾回收来(GC)解决这个问题的,但在OjbC中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人

mengjun_win的博客 679

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

douyin-ios-objectc即时聊天系统:WebSocket协议与表情编辑功能详解

抖音iOS Object-C版(douyin-ios-objectc)是一个功能丰富的开源项目,其中即时聊天系统是其核心模块之一。本文将深入解析该系统如何利用WebSocket协议实现实时通信,以及如何通过精心设计的表情编辑功能提升用户聊天体验。 ## 实时通信的基石:WebSocket协议实现 在即时聊天系统中,实时性是用户体验的关键。douyin-ios-objectc项目采用WebSoc

gitblog_00029的博客 511

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

开源 Objective-C IOS 应用开发(四)Xcode工程文件结构

本文主要记录了Objective-C开发iOS App的学习过程,重点分析了Xcode默认工程文件结构。文章详细介绍了Storyboard模式下Objective-C工程的核心文件:AppDelegate(应用生命周期管理)、ViewController(界面控制)、Main.storyboard(界面设计)、Assets.xcassets(资源管理)和Info.plist(应用配置)。同时阐述了应用启动流程和常规开发方法:通过Storyboard设计界面,ViewController处理交互逻辑,Asse

ajassi2000的博客 1476

Swift还是Objective-C?2024年iOS开发语言选择终极对比分析

想入门iOS开发却纠结语言选择?本文对比Swift与Objective-C在语法、性能、生态及学习成本上的差异,结合2024年开发趋势,帮你明确适用场景。ios开发入门首选指南,值得收藏。

GatherLume的博客 1437

douyin-ios-objectc深度解析:三大核心模块架构设计

抖音iOS Object-C版(douyin-ios-objectc)是一个功能完整的短视频应用实现,其架构设计采用经典的分层模式,主要包含控制器模块、网络模块和数据模型模块三大核心组件。本文将深入剖析这三大模块的设计理念与实现细节,帮助开发者快速理解项目架构。 ## 控制器模块:用户交互的核心枢纽 控制器模块作为应用的"大脑",负责协调用户交互与数据展示,所有界面逻辑均集中在此。项目采用`B

gitblog_00543的博客 645

iOS面试—3、ObjectC 的本质

众说周知,我们平时编写的OC代码,底层都是C/C++实现的,例如: OC —— C/C++ —— 汇编语言 —— 机器语言    我们可以通过一个终端指令,将我们的OC代码转换成C/C++代码,例如: xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.cpp    ...

weixin_30448685的博客 78

iOS开发中微信支付集成

今天又做了微信支付,对于客户端来说,微信支付和支付宝支付相比较还是没有多大差别的,只不过微信支付上传的参数多了些。(但听后台说微信支付较复杂)。 先说下微信支付的流程(个人的理解):(先附上官方文档吧:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5) 1.首先我们需要在微信开放平台中进行注册成为其开发者,然后在微信开

梁森的博客 3987

iOS 开发消息推送(APNS)

转自:http://blog.youkuaiyun.com/shenjie12345678/article/details/41120637 好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:网上看了一下虽然

心虽远,情未变,乐依然。 3090

ios - objectC 的isa 详解

每个Objective-C对象都有一个隐藏的数据结构,这个数据结构是Objective-C对象的第一个成员变量,它就是isa指针。 在NSObject.h里面:  @interface NSObject NSObject> {     Class isa  OBJC_ISA_AVAILABILITY; } 再点开 Class 的定义: struct objc_c

iOS 持续学习 555

玩转iOS“宏定义”

此文转载自:https://my.oschina.net/u/2340880/blog/3357392 LiteOS Studio图形化调测能力,物联网打工人必备!>>> 玩转iOS“宏定义” 宏定义在C类语言中非常重要,因为宏是一种预编译时的功能,因此其可以比运行时更高层面的对程序流程进行控制。在初学宏定义的时候,大家可能都会有这样一种感觉:就是完...

Python研究所 579

学习iOS从object-c开始-语法(一)

       想学习iOS开发,首先就必须学会一门语言,支持iOS开发有俩门语言(objectIve-c和Swift),这篇文章我们先学习object-c,如果想学习swift可以自行百度。        接下就是正文了,大多以截图的形式 这是第一个.m文件   下面是对.m文件的讲解     本篇文章的截图是截取学习视频里面的笔记的,只是我个人用来记录的一种...

Jerryocean的博客 3380

Iphone开发基础篇(六)-ObjectC之Property,assign,retain,copy等关键字

例子: @property(nonatomic,retain) NSString *name; property:属性的定义,相当于Java/C#语言的setter和getter方法。 assign:简单的赋值,不更改索引的计数。 copy:建议一个索引计数为1的对象,然后释放旧对象; retain:释放旧对象,将旧对象的值赋予新对象,再增加新对象的索引计数1。 针对具体的

程序猿GTC 3201
上一篇: IOS开发学习笔记(二十一)——Core Data使用(下篇)
下一篇: 移动应用间调用(Android/iOS)
Soloman
博客等级 码龄25年 171粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值