iOS:实例变量的其他替代方案?

2023-12-27

我有一个别人写的项目,我接手了,希望能把app做得更好。

我遇到了一个问题:

从一个班级:

我写_customclass.variable。 CustomClass是另一个类,variable是一个属性,并且是int类型。我获取了此类中变量的值,但是当我将其更改为 self.customclass.variable 时,我总是得到 0。是否有其他替代方法可以从其他类获取值?

(a)

@property (readwrite)int boxSpacing;

(b)

@synthesize boxSpacing;

(c)

- (id)initWithCoder:(NSCoder *)aDecoder {
    self.boxSpacing = 10;
}

你问:

是否有其他替代方法可以从其他类别获取价值?

简而言之,使用“getter”是从另一个类获取值的惯用方法。但是看看你的问题(承认,没有足够的源代码来正确诊断你的问题),我猜测问题在于实例变量的使用。但稍后会详细介绍。

首先我们来看看正确的使用方法声明的属性 http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/chapters/ocproperties.html及其实例变量和访问器方法(getter 和 setter)。通常,您应该使用这些访问器方法来设置属性。 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447-SW5不过,您可以使用实例变量(并且您不应在初始化程序和 dealloc 方法中使用访问器方法 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447-SW6)。并且在使用getter和setter时,可以选择是否使用方法调用(例如“[self customObject]") 或点符号(例如“self.customObject").

让我们看一个例子。假设您有一些简单的CustomClass:

@interface CustomClass : NSObject
{
    // you don't need to declare the instance variable

    //int _boxSpacing;
}

@property (nonatomic) int boxSpacing;

@end

@implementation CustomClass

// In Xcode 4.4 and later, the synthesize statement is optional, and if you
// omit it, it will synthesize the instance variable like this, with the 
// leading underscore. While you don't need to use an underscore in your
// instance variable, it has become convention in iOS development and it's
// a good technique to minimize chances that you accidentally use the instance
// variable when you actual intended to use the property's accessor methods 
// (the getter and setter). 

@synthesize boxSpacing = _boxSpacing;

@end

现在,我们假设您要使用这个CustomClass例如,从您的视图控制器内部。所以,首先你声明这个实例CustomClass:

@interface MyViewController : UIViewController
{
    // you do not need this instance variable declaration
    // the @synthesize statement will take care of this for you

    // CustomClass *_customObject;
}

@property (nonatomic, strong) CustomClass *customObject;

@end

然后我们来演示如何使用value的财产CustomClass object customObject从你的视图控制器中:

@implementation MyViewController

// Again, in Xcode 4.4 and later, the synthesize statement is optional, and if you
// omit it, it will synthesize the instance variable like this, with the 
// leading underscore 

@synthesize customObject = _customObject;

- (void)customClassTest
{
    // initialize the object

    self.customObject = [[CustomClass alloc] init];

    // set the property

    self.customObject.boxSpacing = 1;

    // finally, let's demonstrate three ways to retrieve the value

    NSLog(@"%d", self.customObject.boxSpacing);
    NSLog(@"%d", [[self customObject] boxSpacing]);
    NSLog(@"%d", _customObject.boxSpacing);

    // while we're at it, let's demonstrate other ways to set the property

    _customObject.boxSpacing = 2;

    // or

    [[self customObject] setBoxSpacing:3];
}

好吧,让我们回到你的问题。你说:

我写_customclass.variable。 CustomClass是另一个类,variable是一个属性,并且是int类型。我得到了这个类中变量的值,但是当我将它更改为 self.customclass.variable 时,我总是得到 0。

好吧,这可能是由几个不同的问题引起的,但我看到的最常见的问题是显式声明的实例变量和由幕后创建的实例变量之间的混淆@synthesize陈述。这就是为什么我总是建议人们不要为其声明的属性显式定义实例变量,而是让@synthesize语句自动执行此操作。这样我就不会遇到我将要演示的那种问题。

考虑这个无害(尽管不正确)的例子:

@interface MyViewController : UIViewController
{
    CustomClass *_customObject;
}

@property (nonatomic, strong) CustomClass *customObject;

@end

@implementation MyViewController

@synthesize customObject;

- (void)customClassTestError
{
    // initialize the object

    self.customObject = [[CustomClass alloc] init];

    // this works

    self.customObject.boxSpacing = 1;

    // this doesn't!

    _customObject.boxSpacing = 2;

    // when it hits this statement, the value will still be 1!!!

    NSLog(@"%d", self.customObject.boxSpacing);
}

你看到问题了吗?当我用下划线声明一个实例变量时,_customObject,当编译器命中@synthesize声明,它创建了another实例变量,这次没有前导下划线,customObject。因此,我显式声明的实例变量从未收到 init/alloc,因此是nil因此任何使用它的尝试都不会成功!

通常我们会看到相反的问题(显式声明的实例变量没有下划线和@synthesize表格的陈述@synthesize customObject = _customObject),但希望你能明白这个想法。

无论如何,这是导致您所描述的行为的最常见示例。如果情况并非如此,请向我们提供更广泛的代码示例。

但如果您遇到问题,我总是建议您检查一下您的价值CustomClass对象本身,然后再尝试访问其属性。在尝试使用类对象的属性之前,请确保类对象本身已正确初始化(无论是出于上面列出的原因还是其他一些初始化问题)。你可以做类似的事情NSLog(@"CustomClass object = %@", customObject); or NSAssert(customObject, @"Object not properly initialized");.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS:实例变量的其他替代方案? 的相关文章

  • iOS 9 的 UIAlertView 的替代方案?

    UAlertView在 iOS 9 及更高版本中已弃用 有什么替代方案吗 UIAlertView new UIAlertView alloc initWithTitle Success message Your InApp Purchase
  • iOS 的 WiFi 连接通知,包括 SSID

    新手 IOS 程序员正在寻找一种在 iPhone 连接到 WIFI 网络时收到通知的方法 IE 关于以下转换的通知 3G转WIFI WIFI转3G WIFI 到另一个 WIFI 它应该能够知道我连接到哪个 SSID 在 Android 上花
  • 来自 facebook 的高分辨率图像

    这就是我获取相册和相册中的图片的方式 let connectionPhotos FBSDKGraphRequestConnection let requestPhotos FBSDKGraphRequest graphPath String
  • 无法将应用程序提交到 AppStore。 “您的应用程序包的签名包含 iOS 不支持的代码签名权利”

    我正在尝试将我的应用程序提交到 AppStore 但一切都是徒劳的 无论我做什么 我都会收到以下错误 我尝试清理 删除派生数据 重新启动 Xcode 重新启动我的 Mac 没有任何帮助 这个答案 https stackoverflow co
  • 为 MoonAPNS 创建 p12 文件时卡住了

    我在创建 p12 证书时遇到一些问题 我之前创建了一个带有推送通知的应用程序 效果很好 应用程序获取用户设备 ID 并将其保存到数据库中 我已将代码添加到我的新应用程序中 并进行了与新应用程序一起使用的修改 从日志来看 它的工作方式似乎与我
  • 如何使用 swift 隐藏导航控制器中的后栏按钮

    在故事板 Xcode 6 iOS 8 和 swift 中 我在导航控制器中嵌入了 TableViewController 从对象库中 我拖放一个栏按钮项目作为后退按钮 它显示一个图标图像 当我单击该按钮时 我显示一个设置视图 我怎样才能隐藏
  • 将设备 3D 方向与太阳位置进行比较

    我正在开发一款应用程序 要求用户将 iPhone 对准太阳才能触发特殊事件 我可以基于陀螺仪和 CoreMotion 框架检索设备 3D 方向四元数 从中我可以获得偏航角 滚动角和俯仰角 我还可以根据当前日期和时间 GMT 以及纬度和经度计
  • 使用 addObserverForName:usingBlock 时删除观察者

    我有以下代码 在视图加载中添加观察者 void viewDidLoad super viewDidLoad NSNotificationCenter defaultCenter addObserverForName com app live
  • 另一个 - “无法识别的选择器发送到实例”问题

    我查看了有关该主题的每个已发布问题 但没有一个给我解决方案 我的项目在很大程度上复制了开发库中的 AVPlayer 演示应用程序 减去清理功能 我有一个复制和粘贴AVPlayerDemoPlaybackView类 重命名为YOPlaybac
  • SpriteKit 中的攻击按钮

    我对 Xcode 有点陌生 一直在为我的班级制作 2d 游戏 我已经有一段时间遇到按钮问题了 我刚刚找到了为什么我的跳跃按钮不起作用的解决方案 但我还有一个攻击按钮 我设置了代码 使按钮显示在屏幕上并在按下时更改其图像 但是 我不知道要放入
  • 如何在 UIStackView 中垂直和水平居中

    I have a simple UIImageView with 50x50 size If I had a UIView of size 100x100 and I wanted to center the image inside of
  • SwiftUI - 正确使用 @available() 和 #available

    我在下面的代码中遗漏了什么吗 此应用程序在 iOS 15 设备上构建 macOS Monterey b5 Xcode 13 b5 并完美执行 但在 iOS 14 7 设备上导致 SIGABRT import SwiftUI struct C
  • 尝试后台获取期间出现 AFNetworking 错误 53

    在更新我的应用程序以支持后台应用程序刷新时 我遇到了 AFNetworking 问题 我正进入 状态NSPOSIXErrorDomain Code 53 Software caused connection abort 该问题似乎出现在 i
  • 相机图像旋转问题

    我在这里面临一个非常奇怪的问题 当我在纵向模式下单击图像并上传它 然后再次获取它时 它会逆时针旋转 90 度显示 但是当我在相机胶卷中看到它时 它会以正确的方向显示 因为它被拍摄 我已经尝试了几乎所有可能的链接 代码来解决这个问题 但似乎没
  • 生成具有给定分布的随机数

    看看这个问题 快速选择随机数的概率 https stackoverflow com questions 26092977 swift probability of random number being selected 最上面的答案建议使
  • cordova 本地通知声音在 ios 和 Android 中不起作用

    我在用cordova plugin local notifications https github com katzer cordova plugin local notifications插入 现在我在 Android 和 iOS 中获
  • iOS:不明确的属性合成行为。继承相关

    我在用着AppCode它标记了一个非常大的项目代码中的一个有趣的情况 预ARC 子类定义并合成一个称为委托的属性 实际上属性声明已经被注释掉了 但是 synthesize delegate delegate 声明被留下了 该代码可以编译 大
  • CGContextSaveGState 无效上下文

    我正在开发一个 iOS 应用程序 它使用实时摄像头扫描条形码和二维码 然而有时我会遇到错误 这些错误不会使应用程序崩溃 但修复它们可能是个好主意 这些是错误
  • 以编程方式在 UIBarButtonItem 上设置辅助功能标识符

    可访问性标识符是开发人员为 GUI 对象生成的 ID 可用于自动化测试 A UIBarButtonItem不执行UIAccessibilityIdentification 但是 我是否可以分配一个辅助功能标识符 你可以子类化UIBarBut
  • iPhone 中的视频过滤速度很慢

    我正在尝试在 iPhone 中过滤视频 这是我的程序结构和源代码 AppDelegate h AppDelegate m ViewController h ViewController m AppDelegate 文件与默认文件相同 这是我

随机推荐

  • 如何使用 Angular 2 创建简单的手风琴?

    之前 我使用这个简单的脚本创建一个简单的手风琴 function dl accordion on click dt function this this this addClass selected next slideDown 200 s
  • Vim 的“(插入)VISUAL”模式?

    The insert VISUAL mode can be entered by CTRL O v starting from insert mode This enters visual mode but is displayed as
  • 证明多线程算法的正确性

    多线程算法尤其难以设计 调试 证明 Dekker 算法是一个很好的例子 说明设计正确的同步算法有多么困难 Tanenbaum 的现代操作系统的 IPC 部分充满了示例 有人对此有很好的参考 书籍 文章 吗 谢谢 如果没有保证 就不可能证明任
  • 如何检查 Jupyter Notebook 中模块的源代码?

    例如 我想直接在笔记本中查看Python库的源代码 有没有办法做到这一点 谢谢 输入完全限定的函数名称 然后输入
  • CSS z-index 不起作用(绝对位置)[重复]

    这个问题在这里已经有答案了 我正在努力让黑色div 相对 高于第二个黄色 绝对 黑色的div的父级也有绝对位置 relative position relative width 40px height 100px background 00
  • knititations 给出 pandoc-citeproc 错误

    我有以下文档 我正在尝试使用 Rstudio 进行编译 output word document pandoc args biblio references bib r library knitcitations cleanbib This
  • 检查无形状可扩展记录之间的子类型关系

    我有两个无形的可扩展记录 person and employee The employee记录是一个子类型person从某种意义上说 因为它具有所有的领域person确实并且这些字段都是相应字段的子类型person import shape
  • python oauthlib:在转义ValueError“只有unicode对象是可转义的”

    我在用着python social auth从我的 Django 应用程序登录社交网络 在我的本地计算机上 一切正常 但是当我部署到服务器时 出现以下错误 oauthlib oauth1 rfc5849 utils in escape Va
  • “始终显示选择”在列表模式下的 CListCtrl 上不起作用

    我希望用户能够在 CListCtrl 中选择项目 然后单击按钮对这些项目进行操作 但是 当焦点从列表中丢失时 即使我将 始终显示选择 设置为 true 也不再显示选择 这种情况在对话框测试工具和我编译的应用程序中都会发生 我使用列表模式 没
  • MySQL 中的 timestampdiff() 相当于 SQL Server 中的 datediff() 吗?

    我正在致力于将功能从 SQL Server 2000 迁移到 MySQL 在 SQL Server 2000 中执行以下语句 输出为 109 SELECT DATEDIFF wk 2012 09 01 2014 10 01 AS NoOfW
  • ajax 与 django 表单

    我可以用 django 添加 ajax 代码吗 我创建了一个简单的注册表单 有 5 个字段 我希望在不同页面但在单个窗口中显示每个字段 这意味着通过使用下一个按钮 5 个页面要显示在一个窗口中 同时我想将每个页面的所有内容添加到我的数据库中
  • 使用 boost 进程获取 shell 命令的标准输出

    我正在尝试在 C 中实现一个函数 该函数运行 shell 命令并返回退出代码 stdout and stderr 我正在使用Boost process library std vector
  • NodeJS、Express,为什么我应该使用 app.enable('trust proxy');

    我需要将 http 重定向到 https 并找到以下代码 app enable trust proxy app use req res next gt if req secure next else res redirect https r
  • 替换 Android 设备上的默认 GPS 信号提供商

    我想用我自己的坐标源替换 Android 手机上的默认 GPS 位置提供程序 是否有任何层 API 库 提供程序允许替换为我的信号提供程序而不是内置硬件 GPS 或从外部插件读取 它应该允许所有依赖 GPS 服务的应用程序接收我的信号而不是
  • Eclipse C 宏自动格式化

    我在 Eclipse CDT 中使用自动格式化时遇到问题 在大多数情况下 它工作得很好 但它似乎坚持将宏调用后的分号放在单独的行上 这是一个错误还是我错误检查了导致此问题的格式设置组合 该问题已在 Eclipse CDT 的更高版本中得到修
  • 在 WPF 树视图中对数据进行分组

    我想创建一个 WPFTreeView有两个分组选项 单选按钮 因此 数据将以两种不同的方式分组为 2 级层次结构 最低级别是实际数据项 组只是表示数据的一种方式 以便于理解 他们还可以按组 复选框 选择项目 但我已经弄清楚了该部分 例如如果
  • 使用 Python 的字符串子序列内核和 SVM

    如何使用子序列内核 SSK Lodhi 2002 在 Python 中训练 SVM 支持向量机 我找到了使用幕府将军库的解决方案 您必须从提交安装它0891f5a38bcb https code google com p shogun to
  • 类型错误:用户不是构造函数 - Mongoose Node.js Express-Validator

    我收到这个错误 用户不是构造函数类型错误 我无法找出代码中有什么问题 任何建议表示赞赏 路线 user js Initialised user js into users js var User require models user if
  • AES 256 解密 - IV 可以安全共享吗?

    继这个问题 https stackoverflow com questions 992019 java 256 bit aes password based encryption及其答案 我正在创建一个应用程序 给定密码字符串 将转换明文并
  • iOS:实例变量的其他替代方案?

    我有一个别人写的项目 我接手了 希望能把app做得更好 我遇到了一个问题 从一个班级 我写 customclass variable CustomClass是另一个类 variable是一个属性 并且是int类型 我获取了此类中变量的值 但