【问题标题】:Using an allocated and initialised object outside of viewDidLoad?在 viewDidLoad 之外使用分配和初始化的对象?
【发布时间】:2015-07-17 15:37:18
【问题描述】:

我希望问题标题足够

只是对我在在线教程中看到的一段代码感到困惑。有一个通用的ZHEDog 类,其中声明了属性、方法等,我们从这个类中创建了几个实例——firstDog、secondDog、fourthDog 等等。

现在,当我们创建每个实例时,我们在 main(one)view 控制器的 viewDidLoad 方法中使用以下代码:

ZHEDog *fourthDog = [[ZHEDog alloc] init];

然后我们在这一行之后设置它的一些属性,例如名称等。

所以我们在视图控制器的 viewDidLoad 中创建了这个实例,到目前为止还没有继承通用的 ZHEDog 类,所以它都是从一个类文件中派生的。

现在,我感到困惑的是,显然我不能在另一个方法中设置这个实例的属性(viewDidLoad 除外),所以我不能说这样的话:

-(void) printHelloWorld
{
fourthDog.name = "something new";
}

这有点道理,但我无法解释为什么。我会认为一旦实例被分配和初始化,我可以在必要时在我想要的地方更改它的属性?但是同样的范围规则是否适用于 viewDidLoad?

【问题讨论】:

    标签: objective-c instances


    【解决方案1】:

    使用属性,它们就像在类实例中的任何地方都可以访问的实例变量

    @property ZHEDog *firstDog, *fourthDog;
    

    然后在viewDidLoad中实例化它们

    self.firstDog = [[ZHEDog alloc] init];
    self.fourthDog = [[ZHEDog alloc] init];
    

    并在方法中更改它们

    -(void) printHelloWorld
    {
    self.firstDog.name = "woof";       
    self.fourthDog.name = "something new";
    }
    

    【讨论】:

    • 感谢 vadian - 我曾想象一个分配和初始化的对象具有某种超能力,而实际上它受到正常范围规则的约束。我不知道为什么我认为它有一个特殊的在其方法范围之外调用的许可证。感谢您指出重新属性,非常有帮助。
    • Vadian,作为一个相关问题 - 如果您确实使用属性,是否可以在 @implementation 部分的开头初始化它们,例如在 viewDidLoad 之上?还是必须在 viewDidLoad 中有这个?
    • 在 Objective-C 中,所有属性都设置为默认值 nil 用于对象,0 / false 用于标量类型。如果您想要自定义默认值,则必须将它们设置为覆盖类的 init 方法。在任何情况下,您都必须在使用其属性之前初始化实例 …dog
    • 再次感谢,但除了 viewDidLoad 之外,在哪里可以初始化实例,即使它们是属性?
    • 在任何你想要的地方创建它们,但无论如何在使用它们之前
    【解决方案2】:

    @vadian 的内容是正确的,但使用属性也可以让其他类看到这个变量。假设您导入了头文件并且它包含@property ZHEDog *firstDog, *fourthDog;。这些变量公开。除非它们在植入文件中。

    但其他方法是像这样创建变量:

    头文件

    @interface ViewController : UIViewController {
        ZHEDog *firstDog, *fourthDog;
    
    }
    
    @end
    

    现在所有值都将是相同的,只是 ViewController 的值是私有的或独占的。因此不允许其他人使用或查看这些变量。并访问函数 printHelloWorld 中的变量:

    - (void)printHelloWorld {
        firstDog.name = @"woof";       
        fourthDog.name = @"something new";
    
    }
    

    分配

    - (void)viewDidLoad {
        //new is the combination of alloc and init. only use +new when using alloc and init, not alloc and initWith...
        firstDog = [ZHEDog new];
        fourthDog = [ZHEDog new];
    
    }
    

    我希望这会更好地实现你的目标:)

    【讨论】:

    • 使用实例变量而不是属性需要实现 getter 和 setter 方法
    • True :3 具有 setter 和 getter 允许在类外访问这些变量。当您只使用类中的变量而不使用其他地方时,是否不需要?
    • OP 想要访问类外的变量 ;-)
    • 使用ZHEDog类实现文件中的变量时不需要setter和getter
    • 特定类的变量必须始终在该类中声明。请阅读developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…
    猜你喜欢
    • 2020-01-03
    • 2010-09-14
    • 2012-11-17
    • 1970-01-01
    • 2013-06-27
    • 2011-12-24
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    相关资源
    最近更新 更多