在 .m 上声明代表

     2023-03-12     148

关键词:

【中文标题】在 .m 上声明代表【英文标题】:Declaring delegates on .m 【发布时间】:2012-11-08 14:42:34 【问题描述】:

我对 Objective-C 比较陌生。

我在网上找到了一个代码,它在 rootViewController.m 上有类似的东西(这是一个基于 navigationController 的应用程序)。

@interface RootViewController (CManagerDelegate) <CManagerDelegate>
@end

@interface RootViewController (PViewDelegate) <PViewDelegate>
@end

两个问题:

    这些行在 rootViewController.m 的开头做了什么 这些行在代码中做了什么?请在这种特殊情况下解释括号中和 之间的内容。

谢谢。

【问题讨论】:

【参考方案1】:

一句话:您发布的代码使RootViewController类私下符合一些委托协议。

委托协议用于让一个类声明它理解来自另一个类对象的消息这一事实。例如,视图控制器可以声明它理解手势识别器的委托消息。

该类在内部使用手势识别器这一事实通常是与该类的其他客户端无关的实现细节。最好不要在公共接口中发布这个事实,而是将其放入实现(.m 文件)中。

类别(和类扩展)让您可以做到这一点:使类符合协议而不更改主要的@interface

一个漂亮而优雅的解决方案!

【讨论】:

好的,但我不明白的是这个。如果声明没有括号部分,我会理解为类分配了委托协议,但括号部分听起来像是对类的扩展。问题是如果所讨论的声明在同一个类本身的实现中,如何扩展一个类。这听起来很疯狂,我的大脑并没有吸收该声明中包含的所有营养。另一个问题是:为什么要让一个类私下遵守协议?是秘密还是什么? :D 啊,另一件事是,声明和@end 之间绝对没有任何内容......只是我提出问题的那几行。 @DesperateDeveloper:这不在@implementation 内;它通常在它之前。 .h/.m 只是约定(实际上,编译器根本不关心 .h 文件,这就是为什么你必须告诉它用#import 来查看它们的原因)。在编译器看到原始的@interface 之后,可以随时扩展类的@interface @DesperateDeveloper:关于类别的隐私:问题不在于它是否应该是私有的;问题是它是否应该公开。通常没有理由公开类符合协议的事实;因此,它应该是私有的。是的,在@interface Foo@end 之间不需要任何东西。您不需要添加自己的任何内容,在这种情况下,协议的内容就是您要声明的所有内容。 谢谢,但你们还没有解释括号部分在做什么...... :)【参考方案2】:

阅读分类:

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/chapters/occategories.html

和协议:

http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/objectivec/chapters/ocProtocols.html

事实上,在继续之前,请阅读 Apple 的所有 Objective-c 文档:

http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/objectivec/Introduction/introObjectiveC.html

祝你好运。

【讨论】:

逃生(地图上的dp)(代码片段)

...上有一个数字,如果格子上的数字是正数说明是一个药剂代表增加的生命值,如果是负数说明是火焰代表失去的生命值。蒜头初始化有v 点血量,他的血量上限是c,任何时刻他的生命值都不能大于血量上限,如果血量为0 ... 查看详情

代表声明困境

】代表声明困境【英文标题】:Delegatedeclarationdilemma【发布时间】:2010-12-0606:24:46【问题描述】:我很困惑-我不明白委托的用途是什么?默认创建的ApplicationDelegate是可以理解的,但在某些情况下我见过这样的:@interfaceMyClass:UIVie... 查看详情

基础类的扩展

...如NSString)的.m文件不可用,我在想是否可以在同一类上声明的类别的.m文件中声明扩展。我成功地创建了一个内部不使用任何实例变量的私有方法。但是,当我尝试访问在接口内声明的iVar时,它会导致问题。*这没有任何目的,... 查看详情

-m选项在python中代表什么?(代码片段)

...iqazxswpoi(在这种情况下是qazxswpoi)。但是,-m旗帜实际上代表什么?是模块的executesamodule,还是venv的-m?我找不到明确的解释。以下是我调查的一些资源:-m-m__main__答案在第1.1.1节中,它清楚地说https://docs.python.org/2/using/cmd 查看详情

p2825[heoi2016/tjoi2016]游戏(代码片段)

...头,但是不能穿透硬石头。给定一张n*m的网格地图:其中*代表空地,炸弹的威力可以穿透,可以在空地上放置一枚炸弹。x代表软石头,炸弹的威力可以穿透,不能在此放置炸弹。#代表硬石头,炸弹的威力是不能穿透的,不能在... 查看详情

xml文件基础

...xml/basic/2018/12/27/xml-file-base.html 1.文件头 XML文件头有XML声明与DTD文件类型声明组成。其中DTD文件类型声明是可以缺少的,关于DTD声明这里不做介绍,而XML声明是必须要有的,以使文件符合XML的标准规格。 在PackageContents.XML文... 查看详情

%1$s,%1$d,%1$f在项目中的运用

上面的三种写法的具体含义如下:%nms:代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格ms:代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格md:代表输出的是整数,n代... 查看详情

接收器类型 '' 例如消息是前向声明(但标头在 .m 中导入)

】接收器类型\\\'\\\'例如消息是前向声明(但标头在.m中导入)【英文标题】:Receivertype\'\'forinstancemessageisaforwarddeclaration(butheaderisimportedin.m)接收器类型\'\'例如消息是前向声明(但标头在.m中导入)【发布时间】:2021-08-1720:13:33【... 查看详情

“L”的 Swift 数据类型代表啥?

...2:54【问题描述】:在prepareForSegue()函数中,我将一个常量声明为ViewController类型。当我访问这个常量时,旁边会出现一个带有字符“L”的值类型。我知道“M”代表方法,“C”代表类,“V”代 查看详情

在 Power Query M 函数中声明变量

】在PowerQueryM函数中声明变量【英文标题】:DeclaringvariablesinPowerQueryMFunctions【发布时间】:2018-06-2708:51:56【问题描述】:我正在尝试在PowerQuery中创建一个可供多个表使用的可重用函数。这很好用(写在空白查询中):letis_emergenc... 查看详情

如何在 MASM 中声明 __m128i 常量?

】如何在MASM中声明__m128i常量?【英文标题】:Howtodeclare__m128iconstantinMASM?【发布时间】:2018-11-2716:59:44【问题描述】:align(16)__xmm@200020000a4f0a4f6621662170707070xmmword200020000a4f0a4f6621662170707070h和__xmm@200020000a4f0a4f6621662170707070 查看详情

笔记本cpu后面的字母有u,h,y,hq,m区别在哪u是低压的玩游戏我不会选他还有

...介绍下各个后缀的意思,从中就可以判断具体区别了:M代表标准电压cpu是可以拆卸的;U代表低电压节能的,可以拆卸的;H是高电压的,是焊接的,不能拆卸;X代表高性能,可拆卸的;Q代表至高性能级别;Y代表超低电压的,除... 查看详情

emacs常用命令快速参考

...来自Emacs参考卡片注意:以下命令中标注的按键,大写的C代表Control,在键盘上通常是Ctrl键,而M代表Meta,在键盘上通常是Alt键,S则代表Shift,在键盘上通常是Shift键,也就是CControlM AltSShift这三个键在Emacs里通常作为组合键的前... 查看详情

nkoj2017信息学夏令营第1场(图论专项练习)

...,[m+1,m+n]表示各个餐桌。从s向i连边,容量为第i个国家的代表数;从m+i向t连边,容量为第i张餐桌的容量;从i向j+m连边,容量为1,这样就限制了每个国家在一个餐桌上至多有一个代表。找到最大流,表示满足条件的代表数量最... 查看详情

无法在 C++ 中声明动态二维数组 [重复]

】无法在C++中声明动态二维数组[重复]【英文标题】:Can\'tdeclaredynamic2DarrayinC++[duplicate]【发布时间】:2013-12-1705:39:25【问题描述】:我遇到了一个问题-我无法在C++中使用由用户编写的整数声明二维数组。这段代码运行良好-cin>... 查看详情

springmvc的运行原理是啥,m代表啥,v代表啥,v包含些啥,m包含些啥??

m代表model模型,v代表view视图,c代表controller,控制器。m中包含你写的业务逻辑,就是取数据的模型,v代表你显示的视图,c来控制m和v之间的关系。mvc的运行原理基本一样没有什么不一样的地方,只是不同的mvc框架的实现技术不... 查看详情

oc中在.h和.m中声明的属性和成员变量有何区别

.h文件是头文件,包含了类,类型、函数与常数的声明;而.m文件是源代码文件;在头文件导入它可以确保相同的文件只会被包含一次,而不会重复的导入相同类型的文件;而在.m文件导入,你就会发现在其他的头文件中可以同样... 查看详情

在 AppDelegate.m 中使用未声明的标识符“对讲机”-react-native-intercom

】在AppDelegate.m中使用未声明的标识符“对讲机”-react-native-intercom【英文标题】:Useofundeclaredidentifier\'Intercom\'inAppDelegate.m-react-native-intercom【发布时间】:2021-06-2020:36:15【问题描述】:我正在使用react-native-intercom在我的应用程序... 查看详情