【问题标题】:Passing a class instance as a parameter to one of its own functions将类实例作为参数传递给它自己的函数之一
【发布时间】:2015-08-14 22:01:26
【问题描述】:

当一个属性类(我们称之为class_X)从另一个类实例化时,class_X的所有方法和函数也包含在每个实例中。

Q1: 这不会增加大量开销,特别是如果该类有多个实例?

类实例(class_X)然后可以作为参数传递给其他类中的其他方法和函数。

Q2: 将其作为参数传递给驻留在同一类中的 C 风格函数(我们称之为 function_C)是否安全(function_C 驻留在 class_X 中)?

提前致谢。

更新:这里有一些代码来说明:

class_X 标头:

    //class_X.h

    @interface class_X : NSObject

    @property (nonatomic, assign) NSInteger intProp;
    @property (nonatomic, strong) NSArray *arrProp;

    void function_C (class_X *cx);

    @end

class_X 实现:

    //class_X.m

    #import "class_X.h"

    @implementation class_X

    void function_C (class_X *cx)
    {
        //code...
    }

    @end  

实例化 class_X:

    @implementation someOtherViewController

    - (void) viewDidLoad {
        [super viewDidLoad];

        class_X *cx = [[class_X alloc] init];

        cx.intProp = 123;
        cx.arrProp = @[@"one", @"two", @"three"];

        function_C (cx);   //does this not cause some sort of recursion?
    }

    @end

【问题讨论】:

    标签: objective-c function class methods properties


    【解决方案1】:

    要有一些命名约定:“类实例”类似于模棱两可。有

    • 具有类的实例(或实例对象)。
    • 类,类似于实例对象的类型。
    • 类对象

    所以我假设您在编写“类实例”时要使用“类 X 的实例对象”。

    致你的问题:

    1. 不,没有开销。与基于原型的 JS 相比,Objective-C 是一种基于类的编程语言。其结果是,每个实例都具有由类声明为实例方法的所有实例方法。因此,对于所有实例,它们仅存储一次。方法的内存占用不取决于创建的实例数。它是一次性的。 (属性的内存占用很大程度上取决于实例的数量。)

    2. 将实例的引用传递给函数是完全安全的。此外,该函数可以在任何地方定义。当然,它必须看到传递实例的类的接口,可能通过导入。

    【讨论】:

    • 非常感谢您的回答。因此,不会为每个实例重复方法,但属性是; 不知道。 另外,您提到该功能可以在任何地方; 即使在同一个班级? (请参阅我更新的代码示例) 属性是否比常规变量重得多?再次感谢您。
    • 1.它可以在同一个类内、不同类或类外。 IE。 NSLog() 是一个 C 函数,不在任何类中。 2. 每个实例 var 具有与本地 var 或全局 var 相同的内存占用,通常是一个机器字(8 字节)。因此,您可以通过以下方式计算大约值:每个实例的属性数 × 实例数 × 8 字节 = 内存占用。
    • 太棒了!最后一张,拜托。当它所在的类被另一个类实例化时,是否不包含 C 风格的函数?在我上面的例子中,即使它被放置在@implementation/@end 类中,function_C() 也不会成为对象的一部分?
    • 不,它们不包括在内:没有理由包括该函数,因为您可以简单地将它与function_c() 一起使用,而与类没有任何关系。甚至函数也是在类中声明的,它们与类或其实例没有关系。
    猜你喜欢
    • 2019-09-29
    • 2015-03-31
    • 2011-03-29
    • 2018-10-10
    • 2016-05-28
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多