【问题标题】:Map C# class into Objective-C one?将 C# 类映射到 Objective-C 类?
【发布时间】:2012-02-13 02:05:47
【问题描述】:

我是一名 C# 开发人员,刚接触 Objective C,由于两种语言之间的差异,这次迁移并不容易。

我尝试做的是创建一个具有与 C# 中类似的属性的类。 如果 for ex 有一个 C# 类,如下所示:

public class X
{
  private int _d, _y;

  public int D { get {return _d; } set{ _d= value;}}
  public int Y { get{ return _y;} set {_y = value;}}
}

谁用 Objective C 写了这个?

我已经尝试过但无法做到这一点。 目前我的目标 C 类如下所示:

@interface X : NSObject
{
   @private
     int _d ,_y;
}

@property (nonatomic, readwrite, retain) int d;
@property (nonatomic, readwrite, retain) int y;

@end

@implementation X

@synthesize d = _d;
@synthesize y = _y;

-(void)dealloc
{
  [d release];
  [y release];
  [super dealloc];
}

@end

提前谢谢你。

【问题讨论】:

  • NSObjective 不应该是 NSObject 吗?您不需要 [d release] 或 [y release] 因为您没有分配对象指针。您也不需要读写或保留。我在 C# 方面也有经验,但对 Objective C 知之甚少
  • 是的,它应该是 NSObject 而不是 NSObjective。

标签: c# objective-c


【解决方案1】:

您几乎正确地做到了。唯一的问题是您的属性是纯整数,因此您无法保留/释放它们。更正的版本将是(只需删除所有保留/释放提及,因为它们适用于objective-c objects):

@interface X :NSObject
{
@private
   int _d ,_y;
}

@property (nonatomic, readwrite) int d;
@property (nonatomic, readwrite) int y;

@end

@implementaion X 
@synthesize d = _d;
@synthesize y = _y;

- (void) dealloc
{    
   [super dealloc];
}
@end

附:基类的正确名称应该是NSObject

【讨论】:

  • 谢谢。同样的事情也适用于 NSString 对象或任何其他对象?
  • 作为一种风格,我喜欢明确地输入assign
【解决方案2】:

您的代码几乎是正确的,但有一个很大的警告:int 和其他原始 C 类型不应发布。只有objects需要被释放,任何使用@interface声明的对象类型。

如果您以 iOS 5 及更高版本为目标并使用 Apple LLVM 编译器和 ARC,您可以使用更少的代码。

@interface X : NSObject
@property(nonatomic, assign) int d;
@property(nonatomic, assign) int y;
@end

@implementation X
@synthesize d = d_, y = y_;
@end

您不需要:

  • 为它们的 owen 块中的属性声明 ivars。
  • 实现一个 dealloc 方法,除非使用高级资源,例如流或观察者。
  • 甚至不需要释放对象

【讨论】:

    【解决方案3】:

    下面的代码就像你在 C# 中的类

    @interface X : NSObject
    {
       @private
       int _d, _y;
    }
    
    @property (nonatomic, assign) int d;
    @property (nonatomic, assign) int y;
    
    @end
    
    @implementation X
    
    @synthesize d = _d;
    @synthesize y = _y;
    
    - (void) dealloc
    {
       [super dealloc];
    }
    
    @end
    

    一些注意事项

    当你使用像 int 这样的原始类型时,你不能保留它。您只能使用分配策略(默认策略)。保留策略仅用于对象。默认情况下还设置了读写策略。如果您只想为该变量设置一个 getter,请使用 readonly(而不是 readwrite)。

    有关详细信息,请参阅properties reference 中的属性声明属性部分。

    编辑

    对于NSString,您可以执行以下操作:

     //.h
    @interface X : NSObject    
    {
        @private
        NSString* _myString;
    }
    
    @property (nonatomic, copy) NSString* myString;
    
    @end
    
    //.m
    @implementation X
    
    @synthesize myString = _myString;
    
    - (void) dealloc
    {
       [_myString release];
       _myString = nil;
    
       [super dealloc];
    }        
    
    @end
    

    由于NSString 是一个对象(注意 *),您必须在 dealloc 方法中释放该对象。

    您应该对NSString 使用复制策略。这在下面的stackoverflow topic中进行了解释。

    【讨论】:

    • 好的,什么被视为目标 C 中的原始类型?
    • 原始类型可以是 int、float、struct.. 通常,原始类型分配在堆栈上(也分配在堆上)。对象只能在堆上分配。
    • 在dealloc函数中只做[mystring release]不够吗??
    • 你可以这样做[_myString release] 而不是[myString release]。没有名为myString 的变量。如果您执行self.myString = nil,您将访问_myString 变量的设置器,将nil 值传递给它。在内部,setter 释放_myString 的当前值。有关详细信息,请阅读ocProperties documentation 中的 Declared Properties 部分
    • 有关属性的更多信息,我建议您阅读assign-retain-copy-pitfalls-in-obj-c
    猜你喜欢
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多