相关疑难解决方法(0)

声明的属性是否需要相应的实例变量?

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)

这仍然有效吗?它与我之前的例子有什么不同吗?

objective-c instance-variables declared-property

102
推荐指数
3
解决办法
3万
查看次数

如何声明在类实例外部不可见或不可用的实例变量和方法?

我已经看了很多关于这个主题的帖子.也许我没有碰到"那个",有人会指出我朝这个方向发展.问题很简单,可能有一个简单的答案.

如果你有两个ivars,比如说,"public_ivar"和"private_ivar",你应该在哪里/如何声明它们,以便public是公共的,什么是private是不会以任何方式暴露给任何查看头文件的人?

在"public_method"和"private_method"的情况下也是同样的问题.

我喜欢干净的头文件(在其他语言中),只显示我希望别人看到的方法和ivars.您应该能够发布您的头文件,而不会遇到某人访问他们不应该访问的东西的危险.你如何在Objective-C中做到这一点.

例如,假设我决定需要使用ivar来跟踪所有需要访问此信息的各种类方法之间的某些数据,计数器或类似的东西.如果在@interface下的标题中传统地声明了这个ivar,那么它的存在是公开广告的,任何创建该类实例的人都可以使用它.理想的情况是,这个ivar在类实现之外根本不可见.

iphone xcode objective-c ios

13
推荐指数
1
解决办法
1万
查看次数

私人合成财产是矛盾吗?

在浏览了初学者的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)

oop iphone encapsulation objective-c

8
推荐指数
1
解决办法
1440
查看次数

在Objective-C中创建私有属性

在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.

答案显然是"停止尝试,只是用实例变量",但我已经被人在苹果告诉他们(个人)完全使用属性感动.他们带来的安全性(如枪上的安全性,更难以在脚中射击自己)让我内心都很开心,所以有没有办法在不借助裸体伊娃的情况下做到这一点?

properties private objective-c

8
推荐指数
1
解决办法
3210
查看次数

什么是现代运行时?

注意:通常在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应用程序开发中的现代运行时到底是什么?

objective-c ios4 ios

5
推荐指数
1
解决办法
788
查看次数

从NSString获取ivar或财产

我们可以得到一个ivarpropertyNSString像我们可以得到一个classNSString使用功能NSClassFromNSString()

iphone objective-c ipad ios

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