Objective-C 2.0中的属性是否需要声明相应的实例变量?例如,我习惯做这样的事情:
MyObject.h
@interface MyObject : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
@end
Run Code Online (Sandbox Code Playgroud)
MyObject.m
@implementation
@synthesize name;
@end
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做了:
MyObject.h
@interface MyObject : NSObject {
}
@property (nonatomic, retain) NSString *name;
@end
Run Code Online (Sandbox Code Playgroud)
这仍然有效吗?它与我之前的例子有什么不同吗?
我已经看了很多关于这个主题的帖子.也许我没有碰到"那个",有人会指出我朝这个方向发展.问题很简单,可能有一个简单的答案.
如果你有两个ivars,比如说,"public_ivar"和"private_ivar",你应该在哪里/如何声明它们,以便public是公共的,什么是private是不会以任何方式暴露给任何查看头文件的人?
在"public_method"和"private_method"的情况下也是同样的问题.
我喜欢干净的头文件(在其他语言中),只显示我希望别人看到的方法和ivars.您应该能够发布您的头文件,而不会遇到某人访问他们不应该访问的东西的危险.你如何在Objective-C中做到这一点.
例如,假设我决定需要使用ivar来跟踪所有需要访问此信息的各种类方法之间的某些数据,计数器或类似的东西.如果在@interface下的标题中传统地声明了这个ivar,那么它的存在是公开广告的,任何创建该类实例的人都可以使用它.理想的情况是,这个ivar在类实现之外根本不可见.
在浏览了初学者的iPhone开发人员书并在线阅读示例代码后,我注意到大多数Objective C程序员几乎合成了每个实例变量.有些变量很方便snythesize,但大多数变量不应该遵循面向对象的封装原则.最糟糕的是标记为私有的合成属性.试图使用其他人的代码的C++程序员将读取头文件中的公共字段和方法.他们将跳过私有变量.这个C++程序员不会知道你打算以某种有意义的方式使用私有属性.
在Apple提供的延迟表图像加载上查看此示例模板:
头
@interface ParseOperation : NSOperation <NSXMLParserDelegate>
{
@private
id <ParseOperationDelegate> delegate;
NSData *dataToParse;
NSMutableArray *workingArray;
AppRecord *workingEntry;
NSMutableString *workingPropertyString;
NSArray *elementsToParse;
BOOL storingCharacterData;
}
Run Code Online (Sandbox Code Playgroud)
资源
@interface ParseOperation ()
@property (nonatomic, assign) id <ParseOperationDelegate> delegate;
@property (nonatomic, retain) NSData *dataToParse;
@property (nonatomic, retain) NSMutableArray *workingArray;
@property (nonatomic, retain) AppRecord *workingEntry;
@property (nonatomic, retain) NSMutableString *workingPropertyString;
@property (nonatomic, retain) NSArray *elementsToParse;
@property (nonatomic, assign) BOOL storingCharacterData;
@end
@implementation ParseOperation
@synthesize delegate, dataToParse, workingArray, workingEntry, workingPropertyString, elementsToParse, storingCharacterData; …Run Code Online (Sandbox Code Playgroud) 在Objective-C中,有一种在.m文件中创建私有方法的hackish方法:
@interface FooClass (PrivateMethods)
- (void) doBar:(id)barAction withBaz:(id)bazAction;
@end
Run Code Online (Sandbox Code Playgroud)
这适用于方法.我试图对一个属性做同样的事情:
@interface BarClass (PrivateMethods)
@property (nonatomic, strong) BazObject *myBaz;
@end
@implementation BarClass
@synthesize myBaz = _myBaz;
[...]
@end
Run Code Online (Sandbox Code Playgroud)
这带来了编译警告:在类'PrivateMethods'中声明的属性无法在类实现中实现.我试图将我的财产转移到一个类别:
@implementation BarClass (PrivateMethods)
@synthesize myBaz = _myBaz;
@end
Run Code Online (Sandbox Code Playgroud)
然后: @synthesize is not allowed in a category's implementation.
答案显然是"停止尝试,只是用实例变量",但我已经被人在苹果告诉他们(个人)完全使用属性感动.他们带来的安全性(如枪上的安全性,更难以在脚中射击自己)让我内心都很开心,所以有没有办法在不借助裸体伊娃的情况下做到这一点?
注意:通常在dealloc方法中,您应该直接释放对象实例变量(而不是调用set访问器并传递nilas参数),如下例所示:
- (void)dealloc {
[property release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
但是,如果使用现代运行时并合成实例变量,则无法直接访问实例变量,因此必须调用访问器方法:
- (void)dealloc {
[self setProperty:nil];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
iOS应用程序开发中的现代运行时到底是什么?
我们可以得到一个ivar或property从NSString像我们可以得到一个class从NSString使用功能NSClassFromNSString()?