(不是)傻目标C继承问题时使用属性 – GCC错误?

(不是)傻目标C继承问题时使用属性 – GCC错误?,第1张

概述更新 – 许多人坚持要我为该财产申报一个iVar.有些人不是这样说,因为我正在使用Modern Runtime(64位).我可以确认我已经成功使用@property没有iVars几个月了.因此,我认为’正确’的答案是一个解释,为什么在64位我突然必须明确声明iVar当(而且只有当)我要从一个小孩类访问它.到目前为止我看到的唯一一个是可能的GCC错误(感谢Yuji).毕竟不是那么简单…为了澄清可能的 更新 – 许多人坚持要我为该财产申报一个iVar.有些人不是这样说,因为我正在使用Modern Runtime(64位).我可以确认我已经成功使用@property没有iVars几个月了.因此,我认为’正确’的答案是一个解释,为什么在64位我突然必须明确声明iVar当(而且只有当)我要从一个小孩类访问它.到目前为止我看到的唯一一个是可能的GCC错误(感谢Yuji).毕竟不是那么简单…为了澄清可能的错误是这样的:当从基类继承时,孩子无法访问父级的iVar IF,该小孩也可以在访问iVar之前使用@synthesize实现一个UNRELATED访问器.

我一直在刮擦我的头几个小时 – 我没有使用继承太多.

在这里我设置了一个简单的Test B类,它继承自测试A,其中声明了一个ivar.但是我收到编译错误,该变量未声明.这只会在我添加属性并合成声明时发生 – 没有它们就可以正常工作.

TestA标题:

#import <Cocoa/Cocoa.h>@interface TestA : NSObject {    Nsstring *testString;}@end

TestA实现为空:

#import "TestA.h"@implementation TestA  @end

TestB标题:

#import <Cocoa/Cocoa.h>#import "TestA.h"@interface TestB : TestA {}@property (nonatomic,retain) Nsstring *testProp;@end

TestB实现(错误 – ‘testString’未声明)

#import "TestB.h"@implementation TestB@synthesize testProp;- (voID)testing{    NSLog(@"test ivar is %@",testString);}@end
解决方法 我认为这是GCC 4.2.1的错误.
我做了这个文件foo.m与内容

#import <Foundation/Foundation.h>@interface TestA : NSObject {    Nsstring *testString;}@end@implementation TestA  @end@interface TestB : TestA {}@property (retain) Nsstring *testProp;@end@implementation TestB@synthesize testProp;- (voID)testing{NSLog(@"test ivar is %@",testString);}@end

请注意,在64位模式下可以省略实例变量.
我的GCC 4.2.1在OS X 10.6.3上给了我一个错误:

$gcc -arch x86_64 -c foo.maho.m: In function ‘-[TestB testing]’:aho.m:19: error: ‘testString’ undeclared (first use in this function)aho.m:19: error: (Each undeclared IDentifIEr is reported only onceaho.m:19: error: for each function it appears in.)

这个编译没有问题的改变

NSLog(@"test ivar is %@",testString);

NSLog(@"test ivar is %@",self->testString);

Clang编译没有任何问题.

(在32位模式下,我得到了

$gcc -arch i386 -c foo.maho.m:17: error: synthesized property ‘testProp’ must either be named the same as a compatible ivar or must explicitly name an ivaraho.m: In function ‘-[TestB testing]’:aho.m:19: error: ‘testString’ undeclared (first use in this function)aho.m:19: error: (Each undeclared IDentifIEr is reported only onceaho.m:19: error: for each function it appears in.)

这是一个完美的预期行为,Manjunath写道.)

然而,我认为访问超类的实例变量通常是一个不错的主意:当您实现超类的方法时,您不能假定有关实例变量的任何内容,因为它可能以最坏的方式被子类调整.你至少需要写下允许实例变量的什么样的 *** 作…记住你可能需要维护你的代码多年!我希望在方法和属性层面保持代码的各个部分之间的编程合同.

最后你应该改变

@property Nsstring *testProp;

@property (copy) Nsstring *testProp;

或至少

@property (retain) Nsstring *testProp;

如果您没有在OS X上使用GC.否则EXP_BAD_ACCESS将等待您!

总结

以上是内存溢出为你收集整理的(不是)傻目标C继承问题时使用属性 – GCC错误?全部内容,希望文章能够帮你解决(不是)傻目标C继承问题时使用属性 – GCC错误?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1029312.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存