recherche

Maison  >  Questions et réponses  >  le corps du texte

关于objective-c类方法与实例方法的一些疑问

之前都是在搞前端js
之后写ios开始慢慢接触objective-c
有个疑问

//实例方法调用
NSString *str1 = [[NSString alloc] initWithString:@"123123"];

//类方法调用
NSString *str2 = [NSString stringWithString@"123123"];

我的疑问可能用上面例子会不太能凸显出来
疑问在于,
实例方法必须创建一个实例后使用实例进行调用
也就是内存中必存在一个实例
如果我想不通过实例来达到某些操作
那在设计API时可以设计成类方法,这样就可以直接通过类名进行调用
但是这种情况难道就不会生成实例在内存中了吗??
或者说,虽然没有生成实例,但内存依然会分配空间
那如果

[XXXClass abc];
[XXXClass bcd];
[XXXClass cde];
[XXXClass def];

这种情况下,内存会分配多少块内存空间呢?
而但代码域(如方法内)结束后,内存空间又是否能正常释放呢?

巴扎黑巴扎黑2772 Il y a quelques jours466

répondre à tous(2)je répondrai

  • 阿神

    阿神2017-04-24 09:15:06

    Dans l'exemple que vous avez donné, qu'il s'agisse d'une méthode objet ou d'une méthode classe, leur but est d'obtenir une instance d'objet.
    Comment configurer vos objets sans allouer d'abord de l'espace mémoire ?
    C'est peut-être ainsi que cela est implémenté dans la méthode de classe :

    + (instancetype)stringWithString:(NSString *)string {
        NSString *str = [[self alloc]initWithString:string];
        return str;
    }

    répondre
    0
  • PHPz

    PHPz2017-04-24 09:15:06

    Maintenez la touche Ctrl enfoncée et cliquez sur NSString pour y jeter un œil.

    - (instancetype)initWithString:(NSString *)aString;
    + (instancetype)stringWithString:(NSString *)string;
    

    Regardez le devant de ces deux méthodes, l'une est "-" et l'autre est "+"
    En oc, si vous déclarez une méthode avec un signe plus, vous pouvez appeler la méthode de cette classe sans instanciation.
    Si vous utilisez un signe moins pour déclarer une méthode, vous devez d'abord allouer un objet avant de pouvoir appeler la méthode dans cette classe.

    répondre
    0
  • Annulerrépondre