相关疑难解决方法(0)

为什么子类@property没有相应的ivar隐藏超类ivars?

以下似乎很简单.有一个带有ivar的超类,以及一个访问(@protected)超类ivar的子类:

// Testclass.h    
@interface TestClass : NSObject {
    NSString *testIvar;
}
@end

//TestClass.m
@implementation TestClass
@end

//TestSubclass.h
@interface TestSubClass : TestClass {
}

@property (nonatomic, retain) NSString *testProperty;
- (void) testMethod;

@end

//TestSubclass.m    
#import "TestSubClass.h"
@implementation TestSubClass

@synthesize testProperty;

- (void) testMethod{
    NSLog(@"The value was: %@", testIvar);
}
@end
Run Code Online (Sandbox Code Playgroud)

简单而正确 - 看似足够.但是,尝试编译(对于iOS 4.2 SDK,使用GCC 4.2)会产生指向NSLog行的错误:'testIvar unclared'.

我是Objective-C的新手,但不能为我的生活看到为什么这应该是一个错误.注释掉testProperty的东西,它编译好了.似乎在没有相应的ivar的子类中添加合成属性实际上隐藏了一个不相关的超类ivar.

任何人都可以告诉我这里发生了什么?相关的,编译错误是否可以预见?(预见它可以节省我一些时间和挫折).

objective-c ios4 ios

12
推荐指数
1
解决办法
1900
查看次数

对于obj-c中的属性,我们是否需要声明实例变量?

对于obj-c中的属性,我们是否需要声明实例变量?

例如,如果我的.h文件如下所示:

@interface MyClass : NSObject {
}

@property (nonatomic, retain) NSNumber *someId;
@property (nonatomic, retain) NSDate *expires;
@property (nonatomic, retain) NSString *someString;

...
Run Code Online (Sandbox Code Playgroud)

那很好吗?它编译和工作,它是'完成的事情'?或者我应该真的做以下事情:

@interface MyClass : NSObject {
    NSNumber *someId;
    NSDate *expires;
    NSString *someString;
}

@property (nonatomic, retain) NSNumber *someId;
@property (nonatomic, retain) NSDate *expires;
@property (nonatomic, retain) NSString *someString;

...
Run Code Online (Sandbox Code Playgroud)

如果我打算总是使用属性访问器,上述任何一种方式都有什么不同吗?

@synthesize是否负责为我创建实例变量?

iphone properties objective-c

4
推荐指数
1
解决办法
264
查看次数

标签 统计

objective-c ×2

ios ×1

ios4 ×1

iphone ×1

properties ×1