我是Objective-C的新手,但我很好奇我在其他任何地方都没有看过的东西.
谁能告诉我在@interface块中声明的私有变量与@implementation在类方法之外的块中声明的变量之间的区别是什么,即:
@interface Someclass : NSObject {
NSString *forExample;
}
@end
Run Code Online (Sandbox Code Playgroud)
与
@implementation Someclass
NSString *anotherExample;
-(void)methodsAndSuch {}
@end
Run Code Online (Sandbox Code Playgroud)
似乎两个变量(forExample,anotherExample)在整个班级中都可以同等地访问,我无法真正发现他们的行为有所不同.第二种形式也称为实例变量吗?
我发现了一篇有趣的文章,描述了如何在Objective-C 2.0中,在实现文件中声明实例变量.考虑这个例子:
@interface MyClass {}
@end
@implementation MyClass {
NSObject *obj1;
NSObject *obj2;
}
@end
Run Code Online (Sandbox Code Playgroud)
注意实例变量obj1,并obj2在不声明的属性.由于它们未使用@property语句声明,因此没有相应的所有权限定符,例如weak/ strong.
我的问题是,使用自动引用计数(ARC)的项目是否记得清理以这种方式声明的对象?任何解决这一具体问题的文件都将受到赞赏.
我正在处理一本书中的代码清单,它有一对变量(特别是NSString*)在@implementation中声明和初始化,而不是@interface,但在任何方法体之外.我以前没见过这个,我想知道这在范围上有什么不同等等.
我已经快速浏览了Objective C Programming Language,但我看不出有什么描述它有什么影响.
谢谢
安迪
这让我感到非常困惑,让我觉得我错过了一些必不可少的东西.但我正在尝试创建一个视图控制器容器来管理两个窗格(类似于SplitViewController,但有一些重要的区别).我几乎没有开始构建课程,所以我现在只有3个iVars:
@implementation SplitViewController{
BOOL _showLeftPane;
UIViewController *_leftController;
UIViewController *_rightController;
}
Run Code Online (Sandbox Code Playgroud)
无论我做什么,我都无法将视图控制器分配给_leftController iVar.大多数情况下,_rightController iVar可以分配.它变得怪异了.如果我切换iVars的顺序,所以_rightController出现在_leftController之前,我不能在第一次尝试时分配任何一个.但是,如果我再次尝试(字面上写两次赋值),_leftController将采取.一直以来,当我使用控制台在分配后立即请求iVar声明中列出的第一个控制器的值时,我得到的值是(UIViewController *) $5 = 0x00000001 [no Objective-C description available].WTF?
出于好奇(因为我可以...我几乎没有开始编写类)我将super从UIViewController更改为NSObject.当我这样做时,分配工作.实际上,除了在loadView上创建一个空白视图之外,赋值就是这个类现在所做的一切.
我错过了什么?
更新 代码的其余部分:
整个.h文件:
#import <UIKit/UIKit.h>
@interface SplitViewController : UIViewController
@property (strong) UIViewController *leftViewController;
@property (strong) UIViewController *rightViewController;
@end
Run Code Online (Sandbox Code Playgroud)
整个.m文件(注意,我尝试过合成属性,相同的行为,除了从控制台调试更难):
@implementation SplitViewController{
BOOL _showLeftPane;
UIViewController *_rightNavController;
UIViewController *_leftNavController;
}
#pragma mark - Init Methods
- (id)init{
if (self = [super initWithNibName:nil bundle:nil]){
_showLeftPane = YES;
}
return self;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
self = …Run Code Online (Sandbox Code Playgroud)